美文网首页Android开发Android开发
Android Fragment在ViewPager中替换

Android Fragment在ViewPager中替换

作者: 超神的菠萝 | 来源:发表于2016-08-08 10:22 被阅读1069次

    大致效果如下

    ![ ![{ZV()3DCQFBB2NRZD5491H2.png](https://img.haomeiwen.com/i1168278/7e5ed14b2cfd253b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ](https://img.haomeiwen.com/i1168278/ee8e30f37fdcc193.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    在viewPager中有5个fragment,在第二个fragment中有一个切换按钮,可以将自己切换为fragment6,之后点击fragment6中的按钮可以切换回来。。。。参考:

    http://blog.csdn.net/z13759561330/article/details/40737381/

    具体代码如下

    FragmentActivity.class

    <pre><code>

    package com.lsp.otherandroidtest.fragment_test;

    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.view.ViewPager;
    import android.support.v7.app.AppCompatActivity;
    import android.view.ViewGroup;

    import com.lsp.otherandroidtest.R;

    import java.util.ArrayList;
    import java.util.List;

    /**

    • Created by lsp on 2016/8/5.
      */
      public class FragmentViewPagerTest extends AppCompatActivity {
      private ViewPager viewPager;
      private FragmentPagerAdapter adapter;
      private List<Fragment> fragmentList;

      private TestFragment testFragment1;
      private TestFragment testFragment2;
      private TestFragment testFragment3;
      private TestFragment testFragment4;
      private TestFragment testFragment5;

      private TestFragment testFragment6;

      private boolean fragmentsUpdateFlag[] = {false, false, false, false, false};

      @Override
      public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_fragment_test);

       initViewPager();
      

      }

      private void initViewPager() {

       viewPager = (ViewPager) findViewById(R.id.id_vp);
      
       testFragment1 = TestFragment.getFragment("1");
       testFragment2 = TestFragment.getFragment("2");
       testFragment3 = TestFragment.getFragment("3");
       testFragment4 = TestFragment.getFragment("4");
       testFragment5 = TestFragment.getFragment("5");
      
       testFragment6 = TestFragment.getFragment("6");
      
       fragmentList = new ArrayList<>();
       fragmentList.add(testFragment1);
       fragmentList.add(testFragment2);
       fragmentList.add(testFragment3);
       fragmentList.add(testFragment4);
       fragmentList.add(testFragment5);
      
       adapter = new MyAdapter(getSupportFragmentManager());
       viewPager.setOffscreenPageLimit(5);
       viewPager.setAdapter(adapter);
      
       testFragment2.setTransListener(new TestFragment.onTranslateClick() {
           @Override
           public void onClick(String msg) {
               //点击切换按钮
               //设置fragment2的tag为true
               fragmentsUpdateFlag[1] = true;
               //替换fragment
               fragmentList.set(1, testFragment6);
               adapter.notifyDataSetChanged();
           }
       });
       testFragment6.setTransListener(new TestFragment.onTranslateClick() {
           @Override
           public void onClick(String msg) {
               //点击切换按钮
               //设置fragment2的tag为true
               fragmentsUpdateFlag[1] = true;
               //替换fragment
               fragmentList.set(1, testFragment6);
               //刷新
               adapter.notifyDataSetChanged();
           }
       });
      

      }

    public class MyAdapter extends FragmentPagerAdapter {
    
        private FragmentManager fm;
    
        public MyAdapter(FragmentManager fm) {
            super(fm);
            this.fm = fm;
        }
    
    
        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position % fragmentList.size());
        }
    
        @Override
        public int getCount() {
            return fragmentList.size();
        }
    
        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            //得到缓存的fragment
    
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
    
            //得到tag
    
    
            String fragmentTag = fragment.getTag();
    
            if (fragmentsUpdateFlag[position % fragmentsUpdateFlag.length]) {
    
                //如果这个fragment需要更新
    
                FragmentTransaction ft = fm.beginTransaction();
    
                //移除旧的fragment
    
                ft.remove(fragment);
    
                //换成新的fragment
    
                fragment = fragmentList.get(position % fragmentList.size());
    
                //添加新fragment时必须用前面获得的tag ❶
    
                ft.add(container.getId(), fragment, fragmentTag);
    
                ft.attach(fragment);
    
                ft.commit();
    
    
                //复位更新标志
    
                fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false;
    
            }
    
    
            return fragment;
        }
    
    
    }
    

    }
    </code>
    </pre>

    FragmentActivity.XML

    <pre></code>
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v4.view.ViewPager
    android:id="@+id/id_vp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
    </LinearLayout>
    </code>
    </pre>

    TestFragment.class

    <pre><code>
    package com.lsp.otherandroidtest.fragment_test;

    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 android.widget.TextView;

    import com.lsp.otherandroidtest.R;

    /**

    • Created by lsp on 2016/8/5.
      */
      public class TestFragment extends Fragment {
      private View view;
      private String msg;
      private onTranslateClick transListener;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_test,null);
        msg = getArguments().getString("msg");
        ((TextView)view.findViewById(R.id.id_tv)).setText(msg);
    
        if("2".equals(msg)||"6".equals(msg))
        (view.findViewById(R.id.id_btn)).setVisibility(View.VISIBLE);
    
    
        (view.findViewById(R.id.id_btn)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                transListener.onClick(msg);
            }
        });
        return view;
    
    }
    
    public void setTransListener(onTranslateClick listener){
        this.transListener = listener;
    }
    
    public interface onTranslateClick{
        void onClick(String msg);
    }
    
    public static TestFragment getFragment(String msg){
        TestFragment testFragment= new TestFragment();
        Bundle bundle = new Bundle();
        bundle.putString("msg",msg);
        testFragment.setArguments(bundle);
    
        return testFragment;
    
    }
    

    }
    </code>
    </pre>

    TestFragment.xml

    <pre><code>
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/id_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="16sp" />
    
    <Button
        android:id="@+id/id_btn"
        android:visibility="gone"
        android:layout_marginTop="10dp"
        android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/id_tv"
        android:text="切换" />
    

    </RelativeLayout>
    </code>
    </pre>
    这里用来表示要替换的Fragment


    Paste_Image.png

    在TestFragment中为按钮做了回调,当点击Fragment的按钮时,在FragmentActivity中处理,


    Paste_Image.png
    这里是点击fragment中的回调处理, Paste_Image.png

    最主要的处理部分在instantiateItem方法中..

    相关文章

      网友评论

        本文标题:Android Fragment在ViewPager中替换

        本文链接:https://www.haomeiwen.com/subject/cgtrsttx.html