Navigation
1、导入库;
def nav_version = "2.4.1" // Java language implementation implementation "androidx.navigation:navigation-fragment:$nav_version" implementation "androidx.navigation:navigation-ui:$nav_version"
2、创建导航;
通过第一个图标加入节点(fragment),placeholder系空的新节点;
通过拖拽设置前后节点;
3、创建一个空Activity作为fragment的容器;
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/goto_00"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragment.GotoActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>
app:navGraph 属性将 NavHostFragment 与导航图相关联。导航图会在此 NavHostFragment 中指定用户可以导航到的所有目的地。
app:defaultNavHost="true" 属性确保您的 NavHostFragment 会拦截系统返回按钮。
注意只能有一个默认 NavHost。如果同一布局(例如,双窗格布局)中有多个宿主,请务必仅指定一个默认 NavHost。
4、根据需求为布局文件实现目标功能;
如:
public class ChooseFragment00 extends Fragment implements View.OnClickListener {
private Button option_a,option_b,option_c;
// Required empty public constructor
public ChooseFragment00 (){}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View view =inflater.inflate(R.layout.fragment_00, container, false);
option_a = view.findViewById(R.id.option_a);
option_a.setOnClickListener(this);
option_b = view.findViewById(R.id.option_b);
option_b.setOnClickListener(this);
option_c = view.findViewById(R.id.option_c);
option_c.setOnClickListener(this);
return view;
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.option_a:
Navigation.findNavController(view).navigate(R.id.action_fragment_00_to_fgt_option_a);
break;
case R.id.option_b:
Navigation.findNavController(view).navigate(R.id.action_fragment_00_to_fgt_option_b);
break;
case R.id.option_c:
Navigation.findNavController(view).navigate(R.id.action_fragment_00_to_fgt_option_c);
break;
}
}
}
onCreateView
View view =inflater.inflate(R.layout.fragment_00, container, false);创建与对应布局的连接;
onClick
实现事件发生。
Menu
1、同样的在res中创建menu文件夹;
2、在menu中创建菜单视图;
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/chat"
android:icon="@drawable/baseline_account_balance_red_500_24dp"
android:title="@string/icon_1"
app:showAsAction="ifRoom" />
<item
android:id="@+id/add_friend"
android:icon="@drawable/baseline_details_white_24dp"
android:title="@string/icon_2" />
</menu>
3、两个主要方法;
//给activity加载menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
//加载菜单文件
inflater.inflate(R.menu.menu_base, menu);
return super.onCreateOptionsMenu(menu);//必须调用父类的方法
}
//重写方法,处理点击菜单项的事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// 处理点击菜单项的事件
switch (item.getItemId()) {
case R.id.chat:
this.textContent.setText("发起群聊!");
return true;
case R.id.add_friend:
this.textContent.setText("添加朋友!");
return true;
default://其他的要这样返回,固定模式
return super.onOptionsItemSelected(item);
}
}
重写onCreateOptionsMenu方法实现对菜单的加载,
重写onOptionsItemSelected方法实现对用户点击菜单项的事件响应,
也可重写onPrepareOptionsMenu() 方法动态改变菜单项