내 안드로이드 애플리케이션에 ViewPager와 5 개의 파편이 있습니다. 이전에는 viewPager.setCurrentItem()
을 사용했지만 탐색 애니메이션 요구 사항이 변경되었습니다. 이전 조각을 호출 할 때 일부 조각의 예를 들어, 왼쪽에서 오른쪽으로 애니메이션을 표시하지 말고 대신 사용자가 다음 조각 (오른쪽에서 왼쪽으로 애니메이션)으로 이동하는 것을 보여 주도록 요청했습니다. 예를 들어, 사용자가 동일한 데이터를 반복해서 삽입해야하는 경우, 새 조각을 만들지 않고 우리가 만든 기존의 조각을 다시 사용했습니다. viewPager.setCurrentItem()
이 조각을 뒤에서 호출 할 때 (예 : we 이제 20 번째 조각에 있고 우리는 10 번째 조각을 호출하고 있습니다.) 돌아가서 왼쪽에서 오른쪽으로 보이는 애니메이션을 보여줍니다.안드로이드 : 돌아갈 때마다 "onCreatedView"가 호출되고 "setUserVisibleHint"가 호출되지 않습니다.
이제 우리는 viewPager.setCurrentItem()
메서드를 사용하지 않고 대신 FragmentTransaction
을 사용합니다. 그러나 우리는 ViewPager에서 조각을 제거하지 않았습니다. 최소한의 작업으로이 작업을 완료해야합니다. (이 요구 사항이 나타나면 프로젝트가 끝났습니다)
그러나 FragmentTransaction
을 사용할 때 새로운 문제가 발생합니다. 우리가 돌아올 때 fragmnets의 onCreateView
항상 전화 받고 있습니다! viewPager.setCurrentItem()
을 사용할 때 이런 일이 발생하지 않았습니다. 한 번만 실행해야하는 코드가 많습니다. onCreateView
에 있습니다.
또 다른 문제는 첫 번째 조각에서만 호출되는 setUserVisibleHint()
이며 이는 초기 실행에서만 발생합니다. fragmnet이 표시 될 때마다 실행해야하는 모든 코드는이 방법에 있습니다.
다음은 Google의 문제를 보여주는 예제 코드입니다.
MainActivity.java
public class MainActivity extends FragmentActivity {
private ViewPager viewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager=(ViewPager)findViewById(R.id.viewPager);
viewPager.setAdapter(new MyPagerAdapter2(getSupportFragmentManager()));
viewPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (viewPager.getCurrentItem() == 0) {
return true;
}
if (viewPager.getCurrentItem() == 1) {
return true;
}
if (viewPager.getCurrentItem() == 2) {
return true;
}
if (viewPager.getCurrentItem() == 3) {
return true;
}
if (viewPager.getCurrentItem() == 4) {
return true;
}
return false;
}
});
}
private class MyPagerAdapter2 extends FragmentPagerAdapter {
public MyPagerAdapter2(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int pos) {
switch(pos) {
case 0: return FirstFragment1.newInstance("FirstFragment_1");
case 1: return SecondFragment1.newInstance("SecondFragment_1");
case 2: return ThirdFragment1.newInstance("ThirdFragment_1");
case 3: return FourthFragment1.newInstance("FourthFragment_1");
case 4: return FifthFragment1.newInstance("FifthFragment_1");
default: return FirstFragment1.newInstance("DefaultFragment_1");
}
}
@Override
public int getCount() {
return 1;
}
}
public void setCurrentItem(int which) {
if(viewPager != null && which >= 0 && which <= 4) {
viewPager.setCurrentItem(which);
}
}
}
FirstFragment1.java
public class FirstFragment1 extends Fragment {
TextView textView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.first_frag_1, container, false);
TextView tv = (TextView) v.findViewById(R.id.tvFragFirst);
tv.setText("FRAGMENT 01");
textView=(TextView)v.findViewById(R.id.textView1);
textView.setText("Fragment Name : - 01");
Log.d("FRAGMENT_01", "ON_CREATE");
Button button1 = (Button) v.findViewById(R.id.nextButton);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getActivity() != null) {
FragmentManager fragmentManager=getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left);
transaction.replace(R.id.firstFragment, new SecondFragment1());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack(null);
transaction.commit();
}
}
});
return v;
}
public static FirstFragment1 newInstance(String text) {
FirstFragment1 f = new FirstFragment1();
Bundle b = new Bundle();
b.putString("msg", text);
f.setArguments(b);
return f;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
Activity a = getActivity();
if (a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
// textView.setText("Fragment Name : - 01");
Log.d("FRAGMENT_01", "VISIBLE_HINT");
}
}
}
SecondFragment1.java
public class SecondFragment1 extends Fragment {
TextView textView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.second_frag_1, container, false);
TextView tv = (TextView) v.findViewById(R.id.tvFragSecond);
tv.setText("FRAGMENT 03");
textView=(TextView)v.findViewById(R.id.textView2);
textView.setText("Fragment Name : - 02");
Log.d("FRAGMENT_02", "ON_CREATE");
Button button=(Button)v.findViewById(R.id.printButton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(getActivity() != null) {
FragmentManager fragmentManager=getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left);
transaction.replace(R.id.secondFrag, new FirstFragment1());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack(null);
transaction.commit();
}
}
});
Button button1=(Button)v.findViewById(R.id.nextButton);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getActivity() != null) {
FragmentManager fragmentManager=getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left);
transaction.replace(R.id.secondFrag, new ThirdFragment1());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack(null);
transaction.commit();
}
}
});
return v;
}
public static SecondFragment1 newInstance(String text) {
SecondFragment1 f = new SecondFragment1();
Bundle b = new Bundle();
b.putString("msg", text);
f.setArguments(b);
return f;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
Activity a = getActivity();
if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
Log.d("FRAGMENT_02","VISIBLE_HINT");
}
}
}
로서 우리 코드에서 볼 수 있듯이 아래에서 Fragments 사이를 탐색합니다. 우리가 onCreateView
한 번만 호출되고 setUserVisibleHint
매번 호출되어 있는지 확인 할 수있는 방법, 우리의 코드를 보면
FragmentManager fragmentManager=getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.from_right, R.anim.to_left);
transaction.replace(R.id.firstFragment, new SecondFragment1());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack(null);
transaction.commit();
(코드 아래의 첫 번째, 두 번째로 fragmnet에서 이동 방송), 우리는뿐만 아니라 ViewPager
을 추가 한 고려 조각이 표시됩니까? 당신이 원하는 모든 코드의
에서 onCreate() 호출을 조각이 – Barrier
볼 때마다 점점 의해 어떤 조각에 응용 프로그램을 실행할 경우 못해 또 다시 호출 될 수있다. –
viewpager를 스 와이프하지 않고 버튼 클릭으로 조각 흐름을 변경합니다. – Barrier