1. 程式人生 > >Fragment複用

Fragment複用

適合tablayout多個選擇按鈕時使用 只用建立一個fragment

我儘量把步驟寫詳細些 應該不難理解

依賴

//TabLayout元件
    implementation 'com.android.support:design:28+'

佈局

    <android.support.design.widget.TabLayout
        android:id="@+id/mTab"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></android.support.design.widget.TabLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/mViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></android.support.v4.view.ViewPager>

建一個實體類  

//用來存放tablayout的名字和url(一般每切換一個都要換頁面內容 所以每建立一個就分配一個url用來網路請求 也可以傳其他值 )
package com.example.lin.myservice.reuse;

public class ReuseEntity {
    private String name;
    private String type;

    public ReuseEntity(String name, String type) {
        this.name = name;
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

在Activity裡建立兩個Arraylist集合

    //用來存放fragment
    private ArrayList<Fragment> mFragment = new ArrayList<>();
    //用來存放tablayout的名字和url(一般每切換一個都要換頁面內容 所以每建立一個就分配一個url用來網路請求 也可以傳其他值 )
    private ArrayList<ReuseEntity> mTitle = new ArrayList<>();

把需要傳入的tablayout的名字和url存入mTitle集合中

如果是網路獲取的值可以for迴圈新增 結果一樣(這裡只存三個值舉個例子:實在是懶得找網址了,就隨便拉了幾個句子傳過去顯示吧)

mTitle.add(new ReuseEntity("奧特曼", "奧特曼的職責是消滅小怪獸"));
        mTitle.add(new ReuseEntity("小怪獸", "我們都是小怪獸,早晚會被正義的奧特曼殺死"));
        mTitle.add(new ReuseEntity("路明非", "不要死"));

然後新建一個fragment 

  1. 建立時 Include fragment factory methods?和Include interface callbacks? 這兩個要選中的
  2. onCreateView方法後邊的全刪掉不用 前邊報錯的也刪掉 暫時用不上

好了 先放一邊 回到Activity  for迴圈把url傳入fragment      一般可以傳兩個String值的 這邊因為只用了一個 後邊就只傳了一個空

for (int i = 0; i < mTitle.size(); i++) {
            mFragment.add(BlankFragment.newInstance(mTitle.get(i).getType(),""));
        }

都儲存完了 接下來寫介面卡

package com.example.lin.myservice.reuse;

import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import java.util.ArrayList;

public class ReuseAdapter extends FragmentPagerAdapter {

    private ArrayList<ReuseEntity> mTitle;
    private ArrayList<Fragment> mFragment;

    public ReuseAdapter(FragmentManager fm, ArrayList<ReuseEntity> mTitle, ArrayList<Fragment> mFragment) {
        super(fm);
        this.mTitle = mTitle;
        this.mFragment = mFragment;
    }

    @Override
    public Fragment getItem(int i) {
        return mFragment.get(i);
    }

    @Override
    public int getCount() {
        return mFragment.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mTitle.get(position).getName();
    }
}

然後呼叫介面卡 繫結viewpager

ReuseAdapter adapter = new ReuseAdapter(getSupportFragmentManager(), mTitle, mFragment);
        mViewPager.setAdapter(adapter);
        //設定可以滑動
        mTab.setTabMode(TabLayout.MODE_SCROLLABLE);
        mTab.setupWithViewPager(mViewPager);

再回到fragment處理髮送過來的資料 給佈局加個id一會用來顯示傳過來的值

<TextView
        android:id="@+id/mName"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/hello_blank_fragment" />

傳過來的值就儲存在mParam1和mParam2中 因為只傳了一個 所以就把mParam1的值賦給TextView

mName.setText(mParam1);

由於網路不好就不發完成圖了 收工收工 溜了溜了