ViewPager에서 조각이 표시되는시기를 확인하는 방법
문제점 : 조각 onResume()
에이 ViewPager
단편은 실제로 표시되기 전에 소성된다.
예를 들어, ViewPager
및 FragmentPagerAdapter
. 두 번째 조각은 권한이있는 사용자 만 사용할 수 있으며 조각이 표시되면 사용자에게 로그인하도록 요청해야합니다 (경고 대화 상자 사용).
그러나 ViewPager
두 번째 조각을 캐시하기 위해 첫 번째 조각이 표시되면 두 번째 조각을 만들고 사용자가 스 와이프를 시작할 때 표시되도록합니다.
따라서 onResume()
이벤트는 표시되기 훨씬 전에 두 번째 조각에서 시작됩니다. 그래서 적절한 순간에 대화 상자를 표시하기 위해 두 번째 조각이 표시 될 때 발생하는 이벤트를 찾으려고합니다.
어떻게 할 수 있습니까?
업데이트 : Android 지원 라이브러리 (rev 11)는 마침내 사용자에게 보이는 힌트 문제를 수정했습니다 . 이제 조각에 지원 라이브러리를 사용하는 경우 gorn의 답변에 설명 된대로 안전하게 사용 getUserVisibleHint()
하거나 재정 setUserVisibleHint()
의하여 변경 사항을 캡처 할 수 있습니다 .
업데이트 1 다음은 getUserVisibleHint()
. 이 값은 기본값 true
입니다.
// Hint provided by the app that this fragment is currently visible to the user.
boolean mUserVisibleHint = true;
따라서 setUserVisibleHint()
호출 되기 전에 사용하려고하면 문제가있을 수 있습니다 . 해결 방법으로 다음 onCreate
과 같은 방법으로 값을 설정할 수 있습니다 .
public void onCreate(@Nullable Bundle savedInstanceState) {
setUserVisibleHint(false);
구식 답변 :
대부분의 사용 사례 ViewPager
에서 한 번에 한 페이지 만 표시하지만에서 사용하는 경우 사전 캐시 된 조각도 "표시"상태 (실제로 표시되지 않음)가 FragmentStatePagerAdapter
됩니다 Android Support Library pre-r11
.
나는 무시한다 :
public class MyFragment extends Fragment {
@Override
public void setMenuVisibility(final boolean visible) {
super.setMenuVisibility(visible);
if (visible) {
// ...
}
}
// ...
}
"가시성"의 가장 적합한 상태라고 생각하는 프래그먼트의 포커스 상태를 캡처하려면 ViewPager에서 하나의 프래그먼트 만 실제로 메뉴 항목을 부모 활동의 항목과 함께 배치 할 수 있기 때문입니다.
ViewPager에서 조각이 표시되는시기를 확인하는 방법
setUserVisibleHint
에서 재정 의하여 다음을 수행 할 수 있습니다 Fragment
.
public class MyFragment extends Fragment {
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
}
else {
}
}
}
이것은 onResume()
예상했던 정상적인 동작 을 복원하는 것 같습니다 . 홈 키를 눌러 앱을 종료 한 다음 앱을 다시 입력하면 잘 작동합니다. onResume()
연속으로 두 번 호출되지 않습니다.
@Override
public void setUserVisibleHint(boolean visible)
{
super.setUserVisibleHint(visible);
if (visible && isResumed())
{
//Only manually call onResume if fragment is already visible
//Otherwise allow natural fragment lifecycle to call onResume
onResume();
}
}
@Override
public void onResume()
{
super.onResume();
if (!getUserVisibleHint())
{
return;
}
//INSERT CUSTOM CODE HERE
}
다음을 사용하는 또 다른 방법이 있습니다 onPageChangeListener
.
ViewPager pager = (ViewPager) findByViewId(R.id.viewpager);
FragmentPagerAdapter adapter = new FragmentPageAdapter(getFragmentManager);
pager.setAdapter(adapter);
pager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int pageNumber) {
// Just define a callback method in your fragment and call it like this!
adapter.getItem(pageNumber).imVisible();
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
setUserVisibleHint()
때때로 전화를 받기 전과 onCreateView()
후에 문제가 발생합니다.
이를 극복하려면 isResumed()
내부 setUserVisibleHint()
방법 도 확인해야합니다 . 그러나이 경우에는 Fragment가 재개되고 표시 되는 경우 에만setUserVisibleHint()
호출 되고 생성되었을 때가 아니라는 것을 깨달았 습니다 .
따라서 Fragment가 visible
일 때 무언가를 업데이트하려면 업데이트 기능을 onCreate()
및 에 두십시오 setUserVisibleHint()
.
@Override
public View onCreateView(...){
...
myUIUpdate();
...
}
....
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){
myUIUpdate();
}
}
업데이트 : 그래도 myUIUpdate()
가끔 두 번 호출 된다는 것을 깨달았 습니다. 그 이유는 3 개의 탭이 있고이 코드가 두 번째 탭에 있으면 첫 번째 탭을 처음 열 때 두 번째 탭도 표시되지 않고 myUIUpdate()
호출됩니다. 그런 다음 두 번째 탭으로 스 와이프하면 myUIUpdate()
from if (visible && isResumed())
이 호출되어 결과적 myUIUpdate()
으로 1 초에 두 번 호출 될 수 있습니다.
다른 문제가 있습니다 !visible
에서 setUserVisibleHint
호출되는 모두 1) 단편 화면 처음으로 전환 할 때이 생성되기 전에 조각 스크린과 2), 밖으로 갈 때.
해결책:
private boolean fragmentResume=false;
private boolean fragmentVisible=false;
private boolean fragmentOnCreated=false;
...
@Override
public View onCreateView(...){
...
//Initialize variables
if (!fragmentResume && fragmentVisible){ //only when first time fragment is created
myUIUpdate();
}
...
}
@Override
public void setUserVisibleHint(boolean visible){
super.setUserVisibleHint(visible);
if (visible && isResumed()){ // only at fragment screen is resumed
fragmentResume=true;
fragmentVisible=false;
fragmentOnCreated=true;
myUIUpdate();
}else if (visible){ // only at fragment onCreated
fragmentResume=false;
fragmentVisible=true;
fragmentOnCreated=true;
}
else if(!visible && fragmentOnCreated){// only when you go out of fragment screen
fragmentVisible=false;
fragmentResume=false;
}
}
설명:
fragmentResume
, fragmentVisible
: 이력서가 아닌 조각이 생성되고 표시 될 때만 myUIUpdate()
in onCreateView()
이 호출 되는지 확인 합니다. 또한 첫 번째 탭에있을 때 문제를 해결하고, 두 번째 탭은 보이지 않아도 생성됩니다. 이것은 그것을 해결하고 때 조각 화면이 보이는지 확인합니다 onCreate
.
fragmentOnCreated
: 조각이 보이지 않도록하고 조각을 처음 만들 때 호출되지 않도록합니다. 이제이 if 절은 조각 밖으로 스 와이프 할 때만 호출됩니다.
업데이트이 모든 BaseFragment
코드를 이와 같은 코드에 넣고 메서드를 재정의 할 수 있습니다 .
감지하기 Fragment
에 ViewPager
눈에 보이는, 꽤 있는지 해요 에만 사용이 setUserVisibleHint
충분하지 않습니다.
다음은 조각이 표시되는지 또는 표시되지 않는지 확인하는 솔루션입니다. 먼저 viewpager를 시작할 때 페이지를 전환하고 다른 활동 / 단편 / 배경 / 전경으로 이동합니다`
public class BaseFragmentHelpLoadDataWhenVisible extends Fragment {
protected boolean mIsVisibleToUser; // you can see this variable may absolutely <=> getUserVisibleHint() but it not. Currently, after many test I find that
/**
* This method will be called when viewpager creates fragment and when we go to this fragment background or another activity or fragment
* NOT called when we switch between each page in ViewPager
*/
@Override
public void onStart() {
super.onStart();
if (mIsVisibleToUser) {
onVisible();
}
}
@Override
public void onStop() {
super.onStop();
if (mIsVisibleToUser) {
onInVisible();
}
}
/**
* This method will called at first time viewpager created and when we switch between each page
* NOT called when we go to background or another activity (fragment) when we go back
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
mIsVisibleToUser = isVisibleToUser;
if (isResumed()) { // fragment have created
if (mIsVisibleToUser) {
onVisible();
} else {
onInVisible();
}
}
}
public void onVisible() {
Toast.makeText(getActivity(), TAG + "visible", Toast.LENGTH_SHORT).show();
}
public void onInVisible() {
Toast.makeText(getActivity(), TAG + "invisible", Toast.LENGTH_SHORT).show();
}
}
설명 아래 logcat을주의 깊게 확인하면이 솔루션이 작동하는 이유를 알 수있을 것입니다.
첫 출시
Fragment1: setUserVisibleHint: isVisibleToUser=false isResumed=false
Fragment2: setUserVisibleHint: isVisibleToUser=false isResumed=false
Fragment3: setUserVisibleHint: isVisibleToUser=false isResumed=false
Fragment1: setUserVisibleHint: isVisibleToUser=true isResumed=false // AT THIS TIME isVisibleToUser=true but fragment still not created. If you do something with View here, you will receive exception
Fragment1: onCreateView
Fragment1: onStart mIsVisibleToUser=true
Fragment2: onCreateView
Fragment3: onCreateView
Fragment2: onStart mIsVisibleToUser=false
Fragment3: onStart mIsVisibleToUser=false
2 페이지로 이동
Fragment1: setUserVisibleHint: isVisibleToUser=false isResumed=true
Fragment2: setUserVisibleHint: isVisibleToUser=true isResumed=true
3 페이지로 이동
Fragment2: setUserVisibleHint: isVisibleToUser=false isResumed=true
Fragment3: setUserVisibleHint: isVisibleToUser=true isResumed=true
배경으로 이동 :
Fragment1: onStop mIsVisibleToUser=false
Fragment2: onStop mIsVisibleToUser=false
Fragment3: onStop mIsVisibleToUser=true
전경으로 이동
Fragment1: onStart mIsVisibleToUser=false
Fragment2: onStart mIsVisibleToUser=false
Fragment3: onStart mIsVisibleToUser=true
도움이되기를 바랍니다.
package com.example.com.ui.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.example.com.R;
public class SubscribeFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_subscribe, container, false);
return view;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// called here
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}
하위 클래스 setPrimaryItem()
에서 재정의 합니다 FragmentPagerAdapter
. 저는이 방법을 사용하는데 잘 작동합니다.
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
// This is what calls setMenuVisibility() on the fragments
super.setPrimaryItem(container, position, object);
if (object instanceof MyWhizBangFragment) {
MyWhizBangFragment fragment = (MyWhizBangFragment) object;
fragment.doTheThingYouNeedToDoOnBecomingVisible();
}
}
Fragment.onHiddenChanged()
그것을 무시하십시오 .
public void onHiddenChanged(boolean hidden)
isHidden()
조각 의 숨겨진 상태 (에서 반환 됨 )가 변경 되었을 때 호출됩니다 . 조각은 숨겨지지 않고 시작됩니다. 조각이 그 상태를 변경할 때마다 호출됩니다.매개 변수
hidden
-boolean
: 프래그먼트가 이제 숨겨져 있으면 True, 보이지 않으면 False입니다.
나는 것을 파악 onCreateOptionsMenu
하고 onPrepareOptionsMenu
방법 만 조각의 경우라고 정말 볼. 나는 이와 같이 작동하는 방법을 찾을 수 없었고 시도 OnPageChangeListener
했지만 상황에서 작동하지 않았습니다. 예를 들어 onCreate
방법 에서 초기화 된 변수가 필요합니다 .
따라서이 두 가지 방법은이 문제에 대한 해결 방법으로 특히 작거나 짧은 작업에 사용할 수 있습니다.
나는 이것이 더 나은 해결책이라고 생각하지만 최고는 아닙니다. 나는 이것을 사용하지만 동시에 더 나은 해결책을 기다립니다.
문안 인사.
kris larson의 pageradapter에서 setPrimaryItem을 재정의하는 또 다른 솔루션 은 거의 나를 위해 일했습니다. 그러나이 메서드는 각 설정에 대해 여러 번 호출됩니다. 또한 이 메서드가 처음 몇 번 호출 될 때 준비되지 않았기 때문에 조각의 뷰 등에서 NPE 를 얻었습니다 . 다음과 같은 변경 사항이 적용되었습니다.
private int mCurrentPosition = -1;
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
if (position == mCurrentPosition) {
return;
}
if (object instanceof MyWhizBangFragment) {
MyWhizBangFragment fragment = (MyWhizBangFragment) object;
if (fragment.isResumed()) {
mCurrentPosition = position;
fragment.doTheThingYouNeedToDoOnBecomingVisible();
}
}
}
조각 안에 다음 코드 추가
@Override
public void setMenuVisibility(final boolean visible)
{
super.setMenuVisibility(visible);
if (visible && isResumed())
{
}
}
FragmentStatePagerAdapters
및 3 개의 탭으로 작업하는 동안 동일한 문제가 발생했습니다 . 첫 번째 탭을 클릭 할 때마다 Dilaog를 표시하고 다른 탭을 클릭하면 숨겨야했습니다.
재정의 setUserVisibleHint()
만으로는 현재 보이는 조각을 찾는 데 도움이되지 않았습니다.
세 번째 탭에서 클릭하면 -----> 첫 번째 탭. 두 번째 조각과 첫 번째 조각에 대해 두 번 트리거되었습니다. isResumed () 메서드와 결합했습니다.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisible = isVisibleToUser;
// Make sure that fragment is currently visible
if (!isVisible && isResumed()) {
// Call code when Fragment not visible
} else if (isVisible && isResumed()) {
// Call code when Fragment becomes visible.
}
}
MVP에는 조각이 발표자에게 뷰가 표시되었음을 알려야하고 발표자는 Dagger에서 fragment.onAttach()
.
setUserVisibleHint()
충분하지 않습니다. 해결해야 할 세 가지 사례를 발견 onAttach()
했습니다 (발표자가 언제 사용 가능한지 알 수 있도록 언급 됨).
조각이 방금 생성되었습니다. 시스템은 다음을 호출합니다.
setUserVisibleHint() // before fragment's lifecycle calls, so presenter is null onAttach() ... onResume()
조각이 이미 생성되었으며 홈 버튼을 눌렀습니다. 앱을 포 그라운드로 복원 할 때 다음이 호출됩니다.
onResume()
방향 변경 :
onAttach() // presenter available onResume() setUserVisibleHint()
가시성 힌트가 발표자에게 한 번만 전달되기를 원하므로 다음과 같이합니다.
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_list, container, false);
setHasOptionsMenu(true);
if (savedInstanceState != null) {
lastOrientation = savedInstanceState.getInt(STATE_LAST_ORIENTATION,
getResources().getConfiguration().orientation);
} else {
lastOrientation = getResources().getConfiguration().orientation;
}
return root;
}
@Override
public void onResume() {
super.onResume();
presenter.onResume();
int orientation = getResources().getConfiguration().orientation;
if (orientation == lastOrientation) {
if (getUserVisibleHint()) {
presenter.onViewBecomesVisible();
}
}
lastOrientation = orientation;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (presenter != null && isResumed() && isVisibleToUser) {
presenter.onViewBecomesVisible();
}
}
@Override public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_LAST_ORIENTATION, lastOrientation);
}
에 의해 감지 focused view
!
이것은 나를 위해 작동합니다
public static boolean isFragmentVisible(Fragment fragment) {
Activity activity = fragment.getActivity();
View focusedView = fragment.getView().findFocus();
return activity != null
&& focusedView != null
&& focusedView == activity.getWindow().getDecorView().findFocus();
}
사용자가 볼 수 있도록 뷰 페이저의 조각이 화면에있을 때 타이머를 실행하려고 할 때이 문제가 발생했습니다.
타이머는 항상 사용자가 조각을보기 직전에 시작되었습니다. onResume()
조각을보기 전에 조각 의 메서드가 호출되기 때문 입니다.
내 해결책은 onResume()
방법을 확인하는 것이 었습니다 . 조각 8이 뷰 호출기 현재 조각 일 때 특정 메서드 'foo ()'를 호출하고 싶었습니다.
@Override
public void onResume() {
super.onResume();
if(viewPager.getCurrentItem() == 8){
foo();
//Your code here. Executed when fragment is seen by user.
}
}
도움이 되었기를 바랍니다. 이 문제가 많이 발생하는 것을 보았습니다. 이것은 내가 본 가장 간단한 해결책 인 것 같습니다. 다른 많은 것들은 하위 API 등과 호환되지 않습니다.
나는 같은 문제가 있었다. ViewPager
다른 조각 수명주기 이벤트를 실행하고 해당 동작을 변경할 수 없습니다. 단편과 사용 가능한 애니메이션을 사용하여 간단한 호출기를 작성했습니다. SimplePager
나는 하위 조각으로 SectionsPagerAdapter를 지원하므로 많은 두통 끝에 마침내이 주제의 솔루션을 기반으로 작동하는 버전을 얻었습니다.
public abstract class BaseFragment extends Fragment {
private boolean visible;
private boolean visibilityHintChanged;
/**
* Called when the visibility of the fragment changed
*/
protected void onVisibilityChanged(View view, boolean visible) {
}
private void triggerVisibilityChangedIfNeeded(boolean visible) {
if (this.visible == visible || getActivity() == null || getView() == null) {
return;
}
this.visible = visible;
onVisibilityChanged(getView(), visible);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!visibilityHintChanged) {
setUserVisibleHint(false);
}
}
@Override
public void onResume() {
super.onResume();
if (getUserVisibleHint() && !isHidden()) {
triggerVisibilityChangedIfNeeded(true);
}
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
triggerVisibilityChangedIfNeeded(!hidden);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
visibilityHintChanged = true;
if (isVisibleToUser && isResumed() && !isHidden()) {
triggerVisibilityChangedIfNeeded(true);
} else if (!isVisibleToUser) {
triggerVisibilityChangedIfNeeded(false);
}
}
@Override
public void onPause() {
super.onPause();
triggerVisibilityChangedIfNeeded(false);
}
@Override
public void onStop() {
super.onStop();
triggerVisibilityChangedIfNeeded(false);
}
protected boolean isReallyVisible() {
return visible;
}
}
에서 ViewPager2
와 ViewPager
버전에서 androidx.fragment:fragment:1.1.0
당신은 사용할 수 있습니다 onPause
및 onResume
콜백은 현재 사용자가 볼 수있는 단편 결정합니다. onResume
콜백은 프래그먼트가 표시되고 표시되지 않을 때 호출됩니다 onPause
.
ViewPager2의 경우 기본 동작이지만 이전 제품에 대해 동일한 동작을 ViewPager
쉽게 사용할 수 있습니다.
첫 번째 ViewPager에서이 동작을 활성화하려면 FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
매개 변수를 FragmentPagerAdapter
생성자의 두 번째 인수 로 전달해야합니다 .
FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
참고 : 하나의 매개 변수가있는 setUserVisibleHint()
메서드 및 FragmentPagerAdapter
생성자는 이제 Android Jetpack의 새 버전의 Fragment에서 더 이상 사용되지 않습니다.
주 setUserVisibleHint(false)
활동 / 조각 정지에 호출되지 않습니다. register/unregister
리스너 등 을 올바르게 시작 / 중지하려면 여전히 확인해야합니다 .
또한 setUserVisibleHint(false)
조각이 보이지 않는 상태에서 시작되면 얻을 수 있습니다. unregister
그 경우에는 전에 등록한 적이 없기 때문에 거기에 가고 싶지 않습니다 .
@Override
public void onStart() {
super.onStart();
if (getUserVisibleHint()) {
// register
}
}
@Override
public void onStop() {
if (getUserVisibleHint()) {
// unregister
}
super.onStop();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isResumed()) {
// register
if (!mHasBeenVisible) {
mHasBeenVisible = true;
}
} else if (mHasBeenVisible){
// unregister
}
}
나는 이것을 사용했고 그것은 효과가 있었다!
mContext.getWindow().getDecorView().isShown() //boolean
프래그먼트로 이동하기 전에 사용자가 로그인했는지 확인하는 간단한 구현 방법입니다 .
MainActivity에서 onNavigationItemSelected 메서드 내에서 이와 같은 작업을 수행 할 수 있습니다 .
case R.id.nav_profile_side:
if (User_is_logged_in) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame
, new FragmentProfile())
.commit();
}else {
ShowLoginOrRegisterDialog(fragmentManager);
}
break;
그러나 내비게이션 드로어를 사용하는 경우 드로어의 선택은 ProfileFragment로 이동하지 않았지만 Profile로 변경됩니다.
선택을 현재 선택으로 재설정하려면 아래 코드를 실행하십시오.
navigationView.getMenu().getItem(0).setChecked(true);
연결된 FragmentStatePagerAdapter의 Count 메서드를 재정의하고 총 개수에서 숨길 페이지 수를 뺀 값을 반환하도록합니다.
public class MyAdapter : Android.Support.V13.App.FragmentStatePagerAdapter
{
private List<Fragment> _fragments;
public int TrimmedPages { get; set; }
public MyAdapter(Android.App.FragmentManager fm) : base(fm) { }
public MyAdapter(Android.App.FragmentManager fm, List<Android.App.Fragment> fragments) : base(fm)
{
_fragments = fragments;
TrimmedPages = 0;
}
public override int Count
{
//get { return _fragments.Count; }
get { return _fragments.Count - TrimmedPages; }
}
}
따라서 처음에 ViewPager에 추가 된 3 개의 조각이 있고 일부 조건이 충족 될 때까지 처음 2 개만 표시되어야하는 경우 TrimmedPages를 1로 설정하여 페이지 수를 재정의하고 처음 두 페이지 만 표시해야합니다.
이것은 끝에있는 페이지에 적합하지만 처음 또는 중간에있는 페이지에는 실제로 도움이되지 않습니다 (많은 방법이 있지만).
'Programing' 카테고리의 다른 글
Solr 대 ElasticSearch (0) | 2020.09.30 |
---|---|
목록 (0) | 2020.09.30 |
MySQL 오류 코드 : MySQL Workbench에서 업데이트 중 1175 (0) | 2020.09.30 |
__proto__ VS. (0) | 2020.09.30 |
Ruby의 여러 줄 주석? (0) | 2020.09.30 |