Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓系统:;onCreatedView“;每次回去时都会打电话,并且;setUserVisibleHint";不叫_Java_Android_Android Fragments_Android Viewpager_Fragmentmanager - Fatal编程技术网

Java 安卓系统:;onCreatedView“;每次回去时都会打电话,并且;setUserVisibleHint";不叫

Java 安卓系统:;onCreatedView“;每次回去时都会打电话,并且;setUserVisibleHint";不叫,java,android,android-fragments,android-viewpager,fragmentmanager,Java,Android,Android Fragments,Android Viewpager,Fragmentmanager,在我的android应用程序中,我有一个ViewPager和5个片段。我以前使用过viewPager.setCurrentItem()导航,但是导航动画的要求已经改变;例如,在一些片段中,当调用前一个片段时,我们被要求不要显示返回(从左到右动画),而是向用户显示他们移动到下一个片段(从右到左动画)。例如,在某些情况下,用户必须一次又一次地插入相同的数据,因此我们没有为这些数据创建新的Fragmnet,而是重新使用我们创建的现有Fragmnet-因此当viewPager.setCurrentIte

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

现在我们不使用
viewPager.setCurrentItem()
方法导航,而是使用
FragmentTransaction
。然而,我们并没有从ViewPager中删除这些片段,希望用最少的工作量来完成这项工作(当这个需求出现时,我们正处于项目的末尾)

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

另一个问题是
setUserVisibleHint()
仅在第一个片段中调用,而且也仅在初始运行时调用!每次显示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);
        }
    }
}
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");

        }
    }

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


        }
    }

}
SecondFragment1.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);
        }
    }
}
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");

        }
    }

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


        }
    }

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


查看我们的代码,并考虑到我们也添加了
ViewPager
,我们如何确保
onCreateView
只调用一次,并且每次显示片段时都调用
setUserVisibleHint
方法和您想要的代码应该每次在onCreateView()中调用

调用setUserVisibleHint时会遇到挑战。请尝试viewPager.setOffscreenPageLimit(5);并使用setMenuVisibility方法,如果您通过通知在任何片段上启动应用程序

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

onCreate()在每次看到片段时都会被调用当您滑动viewpager时,它不会被一次又一次调用。我没有滑动viewpager,我使用按钮单击来更改片段流。