侧拉菜单
1.SlidingPaneLayout
2.DrawerLayout
3.NavigationView
4.SlidingMenu
1.SlidingPaneLayout
布局v4包下,先左侧拉(只有左侧拉),后主页,布局的位置决定前面的是左侧拉
通过slidingPaneLayout.closePane();关闭侧拉
2.DrawerLayout
布局v4包下,先主页,后左侧拉或右侧拉(顺序不能变否则点击事件失效)
通过drawerLayout.closeDrawer(Gravity.LEFT/Gravity.RIGHT);关闭侧拉
3.NavigationView
布局v4包下DrawerLayout,先主页面,后左或右侧拉(引进design包下的NavigationView)
NavigationView可以关联headerLayout和menu
navigationView设置监听,可以响应menu的点击事件
通过drawerLayout.closeDrawer(Gravity.LEFT/Gravity.RIGHT);关闭侧拉
4.SlidingMenu
需要导入第三方控件(不推荐使用)
通过slidingMenu.setMode(SlidingMenu.LEFT_RIGHT);设置两边都可以滑动
slidingMenu.setMenu(R.layout.left_layout);设置左边布局
slidingMenu.setSecondaryMenu(R.layout.right_layout);设置右边布局
第一种:SlidingPaneLayout
布局v4包下,先左侧拉(只有左侧拉),后主页
通过slidingPaneLayout.closePane();关闭侧拉
<android.support.v4.widget.SlidingPaneLayout android:id="@+id/sliding_pane_layout" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="org.mobiletrain.a7_2slidingpanelayout.MainActivity"> <!-- SlidingPaneLayout布局整体上分为两部分,第一部分为左边的侧拉菜单,第二部分为主页面 --> <LinearLayout android:id="@+id/left_layout" android:layout_width="200dp" android:layout_height="match_parent" android:background="#f90101" android:gravity="center" android:orientation="vertical"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent"></ListView> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#08f504" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/tool_bar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimary"></android.support.v7.widget.Toolbar> <Button android:id="@+id/toggle" android:layout_width="wrap_content" android:onClick="toggle" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="主页面"/> </LinearLayout> </android.support.v4.widget.SlidingPaneLayout>
public class MainActivity extends AppCompatActivity {
private List<String> list;
private SlidingPaneLayout slidingPaneLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
ListView listView = (ListView) findViewById(R.id.lv);
final TextView textView = (TextView) findViewById(R.id.tv);
LinearLayout leftLayout = (LinearLayout) findViewById(R.id.left_layout);
ViewGroup.LayoutParams layoutParams = leftLayout.getLayoutParams();
//将100px转为100dp
layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
leftLayout.setLayoutParams(layoutParams);
slidingPaneLayout = (SlidingPaneLayout) findViewById(R.id.sliding_pane_layout);
initData();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
textView.setText(list.get(position));
//关闭侧拉菜单
slidingPaneLayout.closePane();
}
});
}
//点击后退按钮
@Override
public void onBackPressed() {
//如果侧拉菜单打开,则点击后退按钮时关闭侧拉菜单,否则直接退出应用
if (slidingPaneLayout.isOpen()) {
slidingPaneLayout.closePane();
} else {
super.onBackPressed();
}
}
private void initData() {
list = new ArrayList<>();
list.add("收藏");
list.add("钱包");
list.add("相册");
list.add("文件");
}
public void toggle(View view) {
//点击按钮时,如果侧拉菜单已经打开,则关闭,否则打开侧拉菜单
if (slidingPaneLayout.isOpen()) {
slidingPaneLayout.closePane();
} else {
slidingPaneLayout.openPane();
}
}
}
第二种:DrawerLayout
布局v4包下,先主页,后左侧拉或右侧拉(顺序不能变否则点击事件失效)
通过drawerLayout.closeDrawer(Gravity.LEFT/Gravity.RIGHT);关闭侧拉
<android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="org.mobiletrain.a7_2drawerlayout.MainActivity"> <!-- DrawerLayout中整体上分为三大块,分别是主页面,左右两侧的侧拉菜单 android:layout_gravity="left"属性表示该页面是左边的侧拉菜单,注意要给侧拉菜单的布局添加一个背景 android:layout_gravity="right"属性表示该页面是右边侧拉菜单 注意三部分的位置: 第一部分为主界面 第二部分为左边侧拉菜单 第三部分为右边侧拉菜单 如果侧拉菜单写在了主页面之前,则侧拉菜单中的点击事件会失效 --> <RelativeLayout android:id="@+id/main_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="leftToggle" android:text="leftToggle"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:onClick="rightToggle" android:text="@string/righttoggle"/> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="主页面"/> </RelativeLayout> <LinearLayout android:id="@+id/left_layout" android:layout_width="200dp" android:layout_height="match_parent" android:layout_gravity="left" android:background="#00fa08" android:orientation="vertical"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent"></ListView> </LinearLayout> <LinearLayout android:id="@+id/right_layout" android:layout_width="200dp" android:layout_height="match_parent" android:layout_gravity="right" android:background="#fa0212" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="right"/> </LinearLayout> </android.support.v4.widget.DrawerLayout>
public class MainActivity extends AppCompatActivity {
private DrawerLayout drawerLayout;
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
ListView listView = (ListView) findViewById(R.id.lv);
final TextView textView = (TextView) findViewById(R.id.tv);
initData();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
textView.setText(list.get(position));
drawerLayout.closeDrawer(Gravity.LEFT);
}
});
}
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(Gravity.LEFT)) {
drawerLayout.closeDrawer(Gravity.LEFT);
} else if (drawerLayout.isDrawerOpen(Gravity.RIGHT)) {
drawerLayout.closeDrawer(Gravity.RIGHT);
} else {
super.onBackPressed();
}
}
private void initData() {
list = new ArrayList<>();
list.add("收藏");
list.add("钱包");
list.add("文件");
list.add("相册");
}
public void leftToggle(View view) {
//判断左边的侧拉菜单是否打开
if (drawerLayout.isDrawerOpen(Gravity.LEFT)) {
//关闭掉左边的侧拉菜单
drawerLayout.closeDrawer(Gravity.LEFT);
} else {
//打开左边的侧拉菜单
drawerLayout.openDrawer(Gravity.LEFT);
}
}
public void rightToggle(View view) {
//打开右边的侧拉菜单
drawerLayout.openDrawer(Gravity.RIGHT);
}
}
第三种.NavigationView
布局v4包下DrawerLayout,先主页面,后左或右侧拉(引进design包下的NavigationView)
NavigationView可以关联headerLayout和menu
navigationView设置监听,可以响应menu的点击事件
通过drawerLayout.closeDrawer(Gravity.LEFT/Gravity.RIGHT);关闭侧拉
<android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" 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:layout_width="match_parent" android:layout_height="match_parent" tools:context="org.mobiletrain.a7_3drawerlayoutnavigationview.MainActivity"> <!-- 整个页面分为三大块,分别是主界面、左边侧滑界面、右边侧滑界面 --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="主界面"/> </LinearLayout> <!-- android:layout_width="wrap_content"表示NavigaitonView的宽度为屏幕宽度的4/5 app:headerLayout="@layout/header_layout"设置NavigatinView的头布局 app:menu="@menu/main"设置NavigationView的点击项 app:itemBackground="@color/colorPrimary"设置NavigationView item的背景颜色 app:itemIconTint="@color/colorAccent"表示给NavigationView的item上的图片设置统一的颜色 app:itemTextColor=""表示设置NavigationView上item中文本的颜色 --> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="left" android:fitsSystemWindows="true" app:headerLayout="@layout/header_layout" app:menu="@menu/main"></android.support.design.widget.NavigationView> </android.support.v4.widget.DrawerLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="200dp" android:orientation="vertical"> <ImageView android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="centerCrop" android:src="@drawable/p1"/> <Button android:id="@+id/login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="@null" android:gravity="center" android:text="请登录" android:textSize="24sp"/> </RelativeLayout>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/g1"> <item android:id="@+id/favorite" android:icon="@mipmap/ic_launcher" android:title="收藏"/> <item android:id="@+id/wallet" android:icon="@mipmap/ic_launcher" android:title="钱包"/> </group> <group android:id="@+id/g2"> <item android:id="@+id/photo" android:icon="@mipmap/ic_launcher" android:title="相册"/> </group> <item android:id="@+id/file" android:icon="@mipmap/ic_launcher" android:title="文件"/> </menu>
public class MainActivity extends AppCompatActivity {
private DrawerLayout drawerLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView textView = (TextView) findViewById(R.id.tv);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);
//使item上图片的颜色正常显示
navigationView.setItemIconTintList(null);
//设置NavigationView中item的点击事件
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.favorite:
textView.setText("收藏");
break;
}
drawerLayout.closeDrawer(Gravity.LEFT);
return true;
}
});
/****************处理头部点击事件*************************/
//获得头布局
View headerView = navigationView.getHeaderView(0);
Button login = (Button) headerView.findViewById(R.id.login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(Gravity.LEFT)) {
drawerLayout.closeDrawer(Gravity.LEFT);
} else {
super.onBackPressed();
}
}
}
private void initGuide() {
//显示导航按钮
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//1.当前Activity
//2.侧拉菜单的根布局
//3.4.对于侧拉菜单打开或者关闭的一个描述
ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(MainActivity.this,drawerLayout,0,0);
drawerLayout.setDrawerListener(actionBarDrawerToggle);
//表示让ActionBar的状态和DrawerLayout的状态同步
actionBarDrawerToggle.syncState();
}
第四种.SlidingMenu
通过slidingMenu.setMode(SlidingMenu.LEFT_RIGHT);设置两边都可以滑动
slidingMenu.setMenu(R.layout.left_layout);设置左边布局
slidingMenu.setSecondaryMenu(R.layout.right_layout);设置右边布局
*侧滑内容是文本
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SlidingMenu slidingMenu = new SlidingMenu(this);
//设置SlidingMenu的侧滑方式为左右两边都可以滑动
slidingMenu.setMode(SlidingMenu.LEFT_RIGHT);
//设置左边侧拉布局
slidingMenu.setMenu(R.layout.left_layout);
//设置右边侧拉布局
slidingMenu.setSecondaryMenu(R.layout.right_layout);
slidingMenu.setBehindWidth(getResources().getDisplayMetrics().widthPixels / 3);
//第二个参数表示侧拉菜单滑动模式
//1.SlidingMenu.SLIDING_WINDOW:表示侧拉菜单和页面一样高
//2.SlidingMenu.SLIDING_CONTENT:表示侧拉菜单在ActionBar下面活动
slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
}
}
*侧滑内容是Fragment
public class LeftFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
TextView textView = new TextView(getActivity());
textView.setText("left");
return textView;
}
}
public class RightFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
TextView textView = new TextView(getActivity());
textView.setText("right");
return textView;
}
}
public class MainActivity extends SlidingFragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//设置左边侧滑菜单的布局
setBehindContentView(R.layout.left_layout);
SlidingMenu slidingMenu = getSlidingMenu();
slidingMenu.setMode(SlidingMenu.LEFT_RIGHT);
slidingMenu.setSecondaryMenu(R.layout.right_layout);
//设置两边菜单侧拉偏移量为屏幕宽度的1/3
slidingMenu.setBehindWidth(getResources().getDisplayMetrics().widthPixels / 3);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//用Fragment替换左右两边的Linearlayout
transaction.replace(R.id.left_linearlayout, new LeftFragment());
transaction.replace(R.id.right_linearlayout, new RightFragment());
transaction.commit();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现