1. 程式人生 > >Android中的頻道管理

Android中的頻道管理

Android 頻道管理的簡單實現方式

較為簡單的實現方式:

一. 匯入依賴
1. 找到我們 Gradle 下的 含有(root) 然後F4開啟配置:

 allprojects {
     repositories {
    google()
    jcenter()
    //這一行就是我們所需要匯入的依賴:
    maven {url "https://jitpack.io"}
}
}

2.然後找到我們 Gradle 下的 Module的 配置(同樣為F4):

dependencies {
//新增依賴
compile 'com.github.andyoom:draggrid:v1.0.1'
}

二:佈局檔案
採用簡單的相對佈局就可以:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content">

        </android.support.design.widget.TabLayout>
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="+"/>
    </LinearLayout>
    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

三. 程式碼的實現
簡單來說:
大致可以依據我們的控制元件數量來想, Button + TabLayout +ViewPager;
建立可以放置Fragment的集合 + 含有標題欄的字串集合(當然這裡被ChannelBean這個集合所代替);
初始化資料的時候,根據ChannelBean的長度遍歷新增Fragment;
按模擬器返回鍵時利用我們所導的依賴(內部自動含有封裝好的Gson),直接onActivityResult方法中的第三個引數值–data–來獲取值就好了.

public class MainActivity extends AppCompatActivity {

private ViewPager viewpager;
private TabLayout tablayout;
private Button button;
ArrayList<ChannelBean> channelBeanslist = new ArrayList<ChannelBean>();
ArrayList<Fragment> fragmentslist = new ArrayList<Fragment>();
private MyAdapter m;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //初始化元件
    viewpager = findViewById(R.id.viewPager);
    tablayout = findViewById(R.id.tabLayout);
    button = findViewById(R.id.button);

    //初始化資料
    initData();

    //viewpager介面卡
    m = new MyAdapter(getSupportFragmentManager());
    viewpager.setAdapter(m);
    //設定模式(兩種)TabLayout.MODE_SCROLLABLE和MODE_FIXED;
    tablayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    //同事設定TabLayout與ViewPager元件的相連線.
    tablayout.setupWithViewPager(viewpager);

    //點選事件
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //上下文和ChannelBean的集合
            ChannelActivity.startChannelActivity(MainActivity.this,channelBeanslist);
        }
    });

}

class MyAdapter extends FragmentPagerAdapter{

    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

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

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

    @Nullable
    @Override
    //需要手動新增
    public CharSequence getPageTitle(int position) {
        return channelBeanslist.get(position).getName();
    }
}
private void initData() {

    channelBeanslist.add(new ChannelBean("推薦",true));
    channelBeanslist.add(new ChannelBean("熱門",true));
    channelBeanslist.add(new ChannelBean("美女",false));
    channelBeanslist.add(new ChannelBean("遊戲",false));
    for (int i = 0; i < channelBeanslist.size(); i++) {
        ChannelBean channelBean = channelBeanslist.get(i);
        if (channelBean.isSelect()){
            String name = channelBean.getName();
            tablayout.addTab(tablayout.newTab().setText(name));
            if (i == 0){
                fragmentslist.add(new Tuijian());
            }else if(i == 1){
                fragmentslist.add(new Remen());
            }else{
                fragmentslist.add(new Blank());
            }
        }
    }

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //根據靜態string常量獲得返回的json值:
    String stringExtra = data.getStringExtra(ChannelActivity.RESULT_JSON_KEY);
    Type type = new TypeToken<ArrayList<ChannelBean>>() {
    }.getType();
    Gson gson = new Gson();
    channelBeanslist  = gson.fromJson(stringExtra, type);
    //清除(tablayout+fragmentslist)資料
    tablayout.removeAllTabs();
    fragmentslist.clear();
    //遍歷channelBeanslist重新加入導航欄的數量,進行新增Fragment佈局
    for (int i = 0; i < channelBeanslist.size(); i++) {
        ChannelBean channelBean = channelBeanslist.get(i);
        if (channelBean.isSelect()){
            String name = channelBean.getName();
            tablayout.addTab(tablayout.newTab().setText(name));
            if ("推薦".equals(name)){
                fragmentslist.add(new Tuijian());
            }else if("熱門".equals(name)){
                fragmentslist.add(new Remen());
            }else{
                fragmentslist.add(new Blank());
            }
        }
    }
    //提醒介面卡改變
    m.notifyDataSetChanged();
}
}

四:
有個需要注意的地方:
首先:
我們預設的標籤數量為2(這個依賴預設前兩個標籤不可以更換),如果我們預設新增三個標籤(就是channelBeanslist.add的時候,後面我寫了個true),其餘全部新增相同的Fragment,這時候我們來回更換第三個標籤,我們會發現第三個標籤所搭配的Fragment不會跟標籤的改變而改變. 可能只適合預設兩個標籤使用.
其次:
點選按鈕之後,選擇切換標籤的時候,我的頻道中的標籤不可以長按,(單擊增刪頻道,長按拖拽排序,我的app反正是崩潰了)…否則app崩潰.(可能某些客戶網速過慢,長按半天你的APP崩潰了,what,什麼鬼?)
…如果Fragment巢狀過多的話,onActivityResult方法是給不到你的Fragment的,你需要在你自己所依賴的Activity上,才可以找到你自己的Fragment.

五:效果
在這裡插入圖片描述

在這裡插入圖片描述
…可能是我對於原始碼沒搞明白…才會出現我以上說的第四點

以上就是一種簡單的頻道管理實現方式…
望有所助…