1

내 안드로이드 애플리케이션에 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을 추가 한 고려 조각이 표시됩니까? 당신이 원하는 모든 코드의

답변

0

넣고는 에서 onCreate() 당신이 원하는 방법과 코드가 onCreateView() 방법으로 매번 호출 할 필요가에서 매번 호출 할 수 없습니다.

+0

에서 onCreate() 호출을 조각이 – Barrier

+0

볼 때마다 점점 의해 어떤 조각에 응용 프로그램을 실행할 경우 못해 또 다시 호출 될 수있다. –

+0

viewpager를 스 와이프하지 않고 버튼 클릭으로 조각 흐름을 변경합니다. – Barrier

1

setUserVisibleHint를 사용할 때 문제가 발생합니다. viewPager.setOffscreenPageLimit (5); 및 setMenuVisibility 방법을 사용하고 당신이 당신의 viewpager 슬쩍 때 통지

@Override 
public void setMenuVisibility(boolean menuVisible) { 
    super.setMenuVisibility(menuVisible); 
    if(menuVisible && isResumed()){ 
     // do your work here 
    } 
    if(!isResumed()){ 
     // do your work when Activity is created 
    } 
} 
관련 문제