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.
五:效果
…可能是我對於原始碼沒搞明白…才會出現我以上說的第四點
以上就是一種簡單的頻道管理實現方式…
望有所助…