java - android: "onCreatedView"每次返回调用 "setUserVisibleHint"不调用

标签 java android android-fragments android-viewpager fragmentmanager

在我的 android 应用程序中,我有一个 ViewPager 和 5 个 fragment 。我以前用过 viewPager.setCurrentItem()导航,但对导航动画的要求已更改;例如,在某些 fragment 中调用前一个 fragment 时,我们被要求不要显示返回(从左到右动画),而是向用户显示他们移动到下一个 fragment (从右到左动画)。例如,在某些情况下,用户必须一次又一次地插入相同的数据,因此我们没有为这些创建新的 fragmnet,而是重新使用了我们创建的现有数据 - 所以当 viewPager.setCurrentItem()在后面调用一个 fragment (例如:我们现在在第 20 个 fragment 中,我们正在调用第 10 个 fragment )它返回并显示从左到右的动画。

现在我们不使用 viewPager.setCurrentItem()导航的方法,我们使用 FragmentTransaction .然而,无论如何我们都没有从 ViewPager 中删除 fragment ,期望以最少的工作完成这个(当这个需求出现时我们正处于项目结束时)

但是当我们使用 FragmentTransaction我们现在有一个新问题。当我们回来时 onCreateView的 fragmnets 一直被调用!当我们使用 viewPager.setCurrentItem() 时并没有发生这种情况.我们很多应该只运行一次的代码都在这个 onCreateView 中.

另一个问题是 setUserVisibleHint()仅在第一个 fragment 中调用,并且也仅在初始运行时调用!每次显示 fragmnet 时应运行的所有代码都位于此方法中。

下面是一个示例代码,它演示了我们的问题。

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");


        }
    }

}

正如您在我们的代码中看到的,我们使用 below 在 Fragment 之间导航。 (下面的代码显示了从第一个 fragmnet 导航到第二个)

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();

查看我们的代码,考虑到我们添加了 ViewPager同样,我们如何确保 onCreateView只调用一次并且 setUserVisibleHint每次显示 fragment 时调用?

最佳答案

调用setUserVisibleHint时有挑战,试试viewPager.setOffscreenPageLimit(5);并使用 setMenuVisibility 方法,如果您通过通知在任何 fragment 上启动应用程序

@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 
    }
}

关于java - android: "onCreatedView"每次返回调用 "setUserVisibleHint"不调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38137504/

相关文章:

Java - 银行系统+交易功能

android - 在全屏模式下隐藏标题?

android - 我可以使用带有 SerializedName 的 GSON 访问 JSON 的内层吗

android - Android Oreo 上未添加地理围栏

android - 从 fragment 中禁用抽屉导航

java - MapView 上的空指针异常

Java - 突破入侵方法并返回值

java - 初始化扩展 jar 内类的 bean 时上下文初始化失败

java - JDBC连接

android - 无意中在其他 View 后面 fragment 化