我们经常在各类软件中都能看到,点击底部导航栏按钮,能够切换多种界面,并且标题栏也会相对应地改变。在这里我不对fragment做过多的阐述。主要是讲一下在不自定义标题栏的情况下(因为自定义标题栏可能格式,以及按钮等比较复杂),如何做到切换fragment时标题栏中的文字、按钮也相对应地改变。
先放个图。。。
图片太大就先放两张吧。。
具体的代码实现:
首先是在activity_main里面定义标题栏,注意不需要在三个fragment布局界面的xml添加任何关于标题栏的代码。这里把整个activity_main代码贴出来吧。。
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<!--主界面-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!--标题栏-->
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--标题栏-->
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:title="日程"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
<!--阴影-->
<View
android:layout_width="match_parent"
android:layout_height="5dp"
android:background="@drawable/shadow" />
<!--主界面内容-->
<FrameLayout
android:id="@+id/content_mframeLayout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_below="@id/toolbar"
android:layout_weight="1"/>
<!--底部按钮-->
<android.support.design.widget.BottomNavigationView
android:id="@+id/nav_bottombar"
android:layout_width="match_parent"
android:layout_height="57dp"
android:background="?android:attr/windowBackground"
app:menu="@menu/nav_bottom_menu" />
</LinearLayout>
<!--导航栏-->
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:menu="@menu/nav_drawer_menu"/>
</android.support.v4.widget.DrawerLayout>
接着是MainActivity中的代码
public class MainActivity extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
private BottomNavigationView mBottomNavigationView;
public Toolbar mToolbar;
private int lastIndex;
List<Fragment> mFragments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**左侧浮动栏*/
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
final NavigationView navView = (NavigationView) findViewById(R.id.nav_view);
/**底部菜单栏*/
initBottomNavigation();
initData();
/**标题栏初始化*/
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
//标题栏
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
}
}
//初始化fragment
public void initData() {
mFragments = new ArrayList<>();
mFragments.add(new Fragment_schedule());
mFragments.add(new Fragment_people());
mFragments.add(new Fragment_campus());
// 初始化展示MessageFragment
setFragmentPosition(0);
}
//初始化底部菜单栏
public void initBottomNavigation() {
mBottomNavigationView = findViewById(R.id.nav_bottombar);
// 当item大于三个时,非平均布局
/**底部菜单栏监听事件*/
mBottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@SuppressLint("RestrictedApi")
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
boolean isfabAdd = true;
switch (item.getItemId()) {
case R.id.navb_Schedule:
mToolbar.setTitle("日程");
setFragmentPosition(0);
break;
case R.id.navb_People:
mToolbar.setTitle("人脉");
setFragmentPosition(1);
break;
case R.id.navb_Campus:
mToolbar.setTitle("校园");
setFragmentPosition(2);
break;
default:
break;
}
// 这里注意返回true,否则点击失效
return true;
}
});
}
//切换fragment
private void setFragmentPosition(int position) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment currentFragment = mFragments.get(position);
Fragment lastFragment = mFragments.get(lastIndex);
lastIndex = position;
ft.hide(lastFragment);
if (!currentFragment.isAdded()) {
getSupportFragmentManager().beginTransaction().remove(currentFragment).commit();
ft.add(R.id.content_mframeLayout, currentFragment);
}
ft.show(currentFragment);
ft.commitAllowingStateLoss();
}
@Override
/**标题栏监听事件*/
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
mDrawerLayout.openDrawer(GravityCompat.START);
break;
}
return false;
}
}
可以看到,我用了mToolbar.setTitle()设置标题栏的文字覆盖原本在xml中初定义的文字。那么接下来是标题栏中的按钮。。。
很简单,就是在fragment中把标题栏定义的代码小改一下。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
super.onCreateOptionsMenu(menu, inflater);
getActivity().getMenuInflater().inflate(R.menu.people_toolbar,menu);
}
/**标题栏监听事件*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
break;
case R.id.people_add:
Intent intent1=new Intent(getActivity(), Contacts_addActivity.class);
startActivity(intent1);
break;
default:
}
return super.onOptionsItemSelected(item);
}
可以看到,只是在 onCreateOptionsMenu方法里面设置了menu.clear(),就是清除覆盖差不多的意思。接下来导入自己做的menu文件就好,其他的fragment其实也都一样。
其实功能很简单,只是自己贴的代码多了一点。。