android 使用drawerLayout实现侧滑菜单



首先创建一个工程,修改其主布局代码:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <!-- 中间的主题显示区域 -->

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </FrameLayout>

    <!-- 左边的侧滑菜单 -->

    <ListView
        android:id="@+id/lv_leftmenu"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#ffc" >
    </ListView>

    <!-- 右边的侧滑菜单 -->

    <ListView
        android:id="@+id/lv_rightmenu"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:background="#0f0" >
    </ListView>

</android.support.v4.widget.DrawerLayout>
注意:左右抽屉菜单的宽度最好不要超过300do,因为我们要显示抽屉菜单的同时,最好也留一部分区域显示主界面

然后还有就是layout_gravity属性,start就是左菜单,需要从左往右滑才能出来菜单,end的话就是从右往左出来右菜单

内容区域布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="TextView" />

</LinearLayout>

主activity的代码:

package com.example.testdrawerlayoutleft;

import java.util.ArrayList;
import java.util.List;

import android.R.anim;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ListView;

public class Main extends Activity {

	private DrawerLayout drawerLayout;
	private FrameLayout frameLayout;
	private ListView lv_leftmenu;
	private List<String> strlist;
	private ArrayAdapter<String> adapter;
	private ActionBarDrawerToggle mActionBarDrawerToggle;
	private String before_title;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		before_title = (String) getTitle();
		initView();
	}

	/**
	 * 初始化控件
	 */
	private void initView() {
		// TODO Auto-generated method stub
		drawerLayout = (DrawerLayout) findViewById(R.id.drawlayout);
		frameLayout = (FrameLayout) findViewById(R.id.content_frame);
		lv_leftmenu = (ListView) findViewById(R.id.lv_leftmenu);
		strlist = getdata();
		adapter = new ArrayAdapter<String>(Main.this,
				android.R.layout.simple_list_item_1, strlist);
		lv_leftmenu.setAdapter(adapter);// 设置adapter

		lv_leftmenu.setOnItemClickListener(new MyListItemClick());// 设置itemclick

		// 创建一个ActionBarDrawerToggle对象,该对象为了可以相应抽屉打开关闭的事件
		// 第一个参数是我们的activity对象
		// 第二个参数是drawerLayout的布局
		// 第三个是左上角将要显示的图片icon
		// 第四个是抽屉打开时候的文字说明
		// 第五个是抽屉关闭时候的文字说明
		mActionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
				R.drawable.ic_drawer, R.string.drawer_open,
				R.string.drawer_close) {
			@Override
			public void onDrawerOpened(View drawerView) {
				// TODO Auto-generated method stub
				super.onDrawerOpened(drawerView);
				getActionBar().setTitle("请选择");

				// 当我们改变了actiobar的title之后,我们需要更新下actionbar,用来达到actionbar上其他控件显示和隐藏的目的
				// invalidateOptionsMenu();
				// 在这里我们也可以通过menu item的id找到这个view,然后对他直接设置是显示还是隐藏就行了
				findViewById(R.id.menu_search).setVisibility(View.GONE);

			}

			@Override
			public void onDrawerClosed(View drawerView) {
				// TODO Auto-generated method stub
				super.onDrawerClosed(drawerView);
				getActionBar().setTitle(before_title);
				// invalidateOptionsMenu();//执行这个方法之后系统会自动调用onPrepareOptionsMenu方法,所以在onpre方法中,我们也可以设置view的显示和隐藏
				findViewById(R.id.menu_search).setVisibility(View.VISIBLE);

			}
		};

		// 为我们的抽屉设置一个抽屉监听
		drawerLayout.setDrawerListener(mActionBarDrawerToggle);

		// 启用我们actionbar上的图标的功能
		getActionBar().setDisplayHomeAsUpEnabled(true);// 这个是显示左上角的返回图标
		getActionBar().setHomeButtonEnabled(true);
	}

	/**
	 * @return listview所需要的一个集合数据
	 */
	public List<String> getdata() {
		List<String> list = new ArrayList<String>();
		for (int i = 1; i < 10; i++) {
			list.add("第" + i + "个导航菜单");
		}
		return list;
	}

	/**
	 * @author kk_imgod 列表的item的点击监听,在这里我们动态的创建一个fragment并加载到指定的布局中
	 */
	public class MyListItemClick implements OnItemClickListener {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			// 动态的加载fragment
			fragment_content fragment_content = new fragment_content();

			Bundle bundle = new Bundle();
			bundle.putString("text", strlist.get(position));
			fragment_content.setArguments(bundle);

			FragmentManager fragmentManager = getFragmentManager();
			FragmentTransaction fragmentTransaction = fragmentManager
					.beginTransaction();
			fragmentTransaction.replace(R.id.content_frame, fragment_content);
			fragmentTransaction.commit();

			// 实现抽屉的隐藏,以下三种方式都可以实现抽屉的隐藏
			// drawerLayout.closeDrawers();//关闭所有的抽屉,,因为我们可以左右分别设置一个抽屉
			// drawerLayout.closeDrawer(R.id.lv_leftmenu);//关闭指定id的抽屉
			drawerLayout.closeDrawer(lv_leftmenu);// 关闭某一个view抽屉
		}

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see android.app.Activity#onPrepareOptionsMenu(android.view.Menu)
	 * invalidateOptionsMenu();函数会调用这个函数
	 */
	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub
		boolean isshow = drawerLayout.isDrawerOpen(R.id.lv_leftmenu);
		menu.findItem(R.id.menu_search).setVisible(!isshow);
		return super.onPrepareOptionsMenu(menu);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
	 * 加载我们menu目录下的一个布局到界面上的actionbar来
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub
		getMenuInflater().inflate(R.menu.main, menu);
		return super.onCreateOptionsMenu(menu);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
	 * optionmenu的菜单点击之后的相应
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {

		// 一般的想法是在activity的onOptionsItemSelected方法中判断点击事件是否来自于app图标,然后用DrawerLayout.closeDrawer和DrawerLayout.openDrawer来隐藏与展开
		// 下面的一个case语句就是使用的第一种思想,判断我们的item的id为android.R.id.home这个时候就是点击了app图标了
		// 。但是drawerLayout提供了更优雅的方式:
		// 使用ActionBarDrawerToggle的onOptionsItemSelected方法。该方法activity的onOptionsItemSelected方法中根据传递进来的menu
		// item做了上面我们在“一般想法”中提到的事情。用官方的说法是”ActionBarDrawerTogglewill take care
		// of this”。我们只需这样做就ok了
		// actionbar和drawlayout关联起来,实现点击左上角图片的时候可以伸缩抽屉
		if (mActionBarDrawerToggle.onOptionsItemSelected(item)) {
			return false;// 话说这个地方返回true false都可以伸缩抽屉啊...
			// 看来这个返回值果然是留给系统的,好让系统做一些震动啊,声音啊的一些事情
		}

		// actionbar上的item被选择的时候执行的操作
		switch (item.getItemId()) {
		case R.id.menu_search:
			Intent intent = new Intent(Intent.ACTION_VIEW);
			intent.setData(Uri.parse("http://www.baidu.com"));
			startActivity(intent);
			break;
		/*
		 * case android.R.id.home: boolean isshow =
		 * drawerLayout.isDrawerOpen(R.id.lv_leftmenu); if(isshow) {
		 * drawerLayout.closeDrawer(R.id.lv_leftmenu); } else {
		 * drawerLayout.openDrawer(R.id.lv_leftmenu); } break;
		 */
		}
		return super.onOptionsItemSelected(item);
	}

	// 这个是实现左上角的那个动画的,主要是利用toggle的同步状态方法,把toggle的icon设置给actionbar
	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onPostCreate(savedInstanceState);
		mActionBarDrawerToggle.syncState();
	}

	// 屏幕旋转的时候,我们所需要执行的同步配置
	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		// TODO Auto-generated method stub
		super.onConfigurationChanged(newConfig);
	}

}

fragment的代码:

package com.example.testdrawerlayoutleft;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class fragment_content extends Fragment {

	private View view;
	private TextView tv;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		//2015年4月10日 23:43:03
		// 这个地方的inflater需要注意,自己比较喜欢使用两个参数的inflater,直接第一个是资源id,第二个是需要加载到的哪一个viewgroup对象
		// 但是在这里会有一个很操心的问题,那就是this view alerly hava a parpent,you must clear
		// this view
		// 这个异常会导致我们的程序崩溃掉,而产生这个问题的原因也就是,我们的inflater默认把我们新加载的布局,和父布局关联起来
		// Whether the inflated hierarchy should be attached to the root
		// parameter? If false, root is only used to create the correct subclass
		// of LayoutParams for the root view in the XML.
		//这里我们使用三个参数的inflater,然后第三个参数指定为false就可以满足我们的需求了...
		view = inflater.inflate(R.layout.fragment_content, container, false);
		tv = (TextView) view.findViewById(R.id.tv_title);
		Bundle bundle = getArguments();
		String text = bundle.getString("text");
		tv.setText(text);
		return view;
	}
}


demo下载地址: demo地址



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值