MATERIAL DESIGN 的TabLayou + Fragment 切换 ,保存状态
MainActivity.java
package com.blink.blinkdemo.activity; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import android.os.Bundle; import android.os.PersistableBundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.TextView; import com.blink.blinkdemo.R; import com.blink.blinkdemo.fragment.FragmentBTCallHistory; import com.blink.blinkdemo.fragment.FragmentBTCallPhone; import com.blink.blinkdemo.fragment.FragmentBTMusic; import com.blink.blinkdemo.fragment.FragmentBTPairedHistory; import com.blink.blinkdemo.fragment.FragmentBTPhoneBook; import com.blink.blinkdemo.fragment.FragmentBTSetting; import com.google.android.material.tabs.TabLayout; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private final static String TAG = "MainActivity"; private static final String PAIRED_FRAGMENT_KEY = "PairedFragment"; private static final String CALL_FRAGMENT_KEY = "CallFragment"; private static final String LOG_FRAGMENT_KEY = "LogFragment"; private static final String MUSIC_FRAGMENT_KEY = "MusicFragment"; private static final String PHONE_BOOK_FRAGMENT_KEY = "PhoneBookFragment"; private static final String SET_FRAGMENT_KEY = "SetFragment"; private TabLayout mTabLayout; private FrameLayout mFrameLayout; private String[] mString = new String[]{"蓝牙_拨号", "蓝牙_电话本", "蓝牙_通话记录", "蓝牙_音乐", "蓝牙_连接", "蓝牙_设置"}; private ArrayList<Fragment> mFragmentArrayList = new ArrayList<>(); private FragmentBTPairedHistory mBTPairedHistory; private FragmentBTCallPhone mBTCallPhone; private FragmentBTCallHistory mBTCallHistory; private FragmentBTMusic mBTMusic; private FragmentBTPhoneBook mBTPhoneBook; private FragmentBTSetting mBTSetting; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Hide both the navigation bar and the status bar. getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); if (savedInstanceState != null) { /*获取保存的fragment 没有的话返回null*/ mBTCallPhone = (FragmentBTCallPhone) getSupportFragmentManager().getFragment(savedInstanceState, CALL_FRAGMENT_KEY); mBTPairedHistory = (FragmentBTPairedHistory) getSupportFragmentManager().getFragment(savedInstanceState, PAIRED_FRAGMENT_KEY); mBTCallHistory = (FragmentBTCallHistory) getSupportFragmentManager().getFragment(savedInstanceState, LOG_FRAGMENT_KEY); mBTMusic = (FragmentBTMusic) getSupportFragmentManager().getFragment(savedInstanceState, MUSIC_FRAGMENT_KEY); mBTPhoneBook = (FragmentBTPhoneBook) getSupportFragmentManager().getFragment(savedInstanceState, PHONE_BOOK_FRAGMENT_KEY); mBTSetting = (FragmentBTSetting) getSupportFragmentManager().getFragment(savedInstanceState, SET_FRAGMENT_KEY); addToList(mBTCallPhone); addToList(mBTPairedHistory); addToList(mBTMusic); addToList(mBTPhoneBook); addToList(mBTSetting); addToList(mBTCallHistory); } else { initFragment(); } initView(); } private void initView() { mFrameLayout = findViewById(R.id.fl_content); mTabLayout = findViewById(R.id.tabLayout); for (int i = 0; i < mString.length; i++) { mTabLayout.addTab(mTabLayout.newTab().setCustomView(setCustomTab(i))); //mTabLayout.getTabAt(i).setCustomView(setCustomTab(i)); } mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { //选中某个tab int index = tab.getPosition(); //Log.d(TAG,index+""); switch (index) { case 0: if (mBTCallPhone == null) { mBTCallPhone = new FragmentBTCallPhone(); } addFragment(mBTCallPhone); showFragment(mBTCallPhone); break; case 1: if (mBTPhoneBook == null) { mBTPhoneBook = new FragmentBTPhoneBook(); } addFragment(mBTPhoneBook); showFragment(mBTPhoneBook); break; case 2: if (mBTCallHistory == null) { mBTCallHistory = new FragmentBTCallHistory(); } addFragment(mBTCallHistory); showFragment(mBTCallHistory); break; case 3: if (mBTMusic == null) { mBTMusic = new FragmentBTMusic(); } addFragment(mBTMusic); showFragment(mBTMusic); break; case 4: if (mBTPairedHistory == null) { mBTPairedHistory = new FragmentBTPairedHistory(); } addFragment(mBTPairedHistory); showFragment(mBTPairedHistory); break; case 5: if (mBTSetting == null) { mBTSetting = new FragmentBTSetting(); } addFragment(mBTSetting); showFragment(mBTSetting); break; } } @Override public void onTabUnselected(TabLayout.Tab tab) { //当tab从选择到未选择 } @Override public void onTabReselected(TabLayout.Tab tab) { //已经选中tab后的重复点击tab } }); } private View setCustomTab(int i) { View view = LayoutInflater.from(this).inflate(R.layout.tab_item, null); TextView textView = view.findViewById(R.id.tv_title); textView.setText(mString[i]); return view; } private void initFragment() { mBTPairedHistory = new FragmentBTPairedHistory(); addFragment(mBTPairedHistory); showFragment(mBTPairedHistory); } /*显示fragment * 旋转屏幕时,activity是会被onDestory的,在onDestory之前执行了onSaveInstanceState(Bundle outState)这个方法, * 这个方法保存了activity的一些状态信息,其中就包括所添加过的fragment。 * */ private void showFragment(Fragment fragment) { for (Fragment frag : mFragmentArrayList) { if (frag != fragment) { getSupportFragmentManager().beginTransaction().hide(frag).commit(); } } /*getSupportFragmentManager().beginTransaction(). setCustomAnimations(R.anim.slide_left_in,R.anim.slide_left_out).commit();*/ getSupportFragmentManager().beginTransaction().show(fragment).commit(); } private void addFragment(Fragment fragment) { /*判断该fragment是否已经被添加过 如果没有被添加 则添加*/ if (!fragment.isAdded()) { getSupportFragmentManager().beginTransaction().add(R.id.fl_content, fragment).commit(); /*添加到 fragmentList*/ mFragmentArrayList.add(fragment); } } private void addToList(Fragment fragment) { if (fragment != null) { mFragmentArrayList.add(fragment); } Log.d(TAG, "fragmentList数量" + mFragmentArrayList.size()); } @Override public void onSaveInstanceState(@NonNull Bundle outState, @NonNull PersistableBundle outPersistentState) { Log.d(TAG,"onSaveInstanceState"); /*fragment不为空时,保存*/ if(mBTPairedHistory != null){ getSupportFragmentManager().putFragment(outState,PAIRED_FRAGMENT_KEY,mBTPairedHistory); } if(mBTCallPhone != null){ getSupportFragmentManager().putFragment(outState,CALL_FRAGMENT_KEY,mBTCallPhone); } if(mBTCallHistory != null){ getSupportFragmentManager().putFragment(outState,LOG_FRAGMENT_KEY,mBTCallHistory); } if(mBTPhoneBook != null){ getSupportFragmentManager().putFragment(outState,PHONE_BOOK_FRAGMENT_KEY,mBTPhoneBook); } if(mBTMusic != null){ getSupportFragmentManager().putFragment(outState,MUSIC_FRAGMENT_KEY,mBTMusic); } if(mBTSetting != null){ getSupportFragmentManager().putFragment(outState,SET_FRAGMENT_KEY,mBTSetting); } super.onSaveInstanceState(outState, outPersistentState); } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!