androiddrawerlayout
‘壹’ android 我用drawerlayout弄了个右滑抽屉
因为滑出的菜单栏 没有处理触发事件 所以才导致下层的ListView捕获监听 一个很简单的解决办法 给整个菜单布局 加一个setOnTouchListener 重写ontouch方法 返回true 就OK了
‘贰’ android drawerlayout一点就没
drawerlayout本身不上下滑动,要添加ScrollView,ListView或者NavigationView.
‘叁’ Android的drawerlayout侧拉出的菜单如何添加fragment呢
在Android support.v4 中有一个抽屉视图控件DrawerLayout。使用这个控件,可以生成通过在屏幕上水平滑动打开或者关闭菜单,能给用户一个不错的体验效果。
最近在项目中,设计中有用到这个效果,但是是左右两边都能划出这样的一个菜单效果。经过使用发现,在xml布局中和代码中,几乎是添加添加同样的代码,就可以实现这种作用两种菜单的效果。
‘肆’ Android DrawerLayout怎么设置背景图案
DrawerLayout组件同样是V4包中的组件,也是直接继承于ViewGroup类,所以这个类也是一个容器类。使用DrawerLayout可以轻松的实现抽屉效果,使用DrawerLayout的步骤有以下1几点:
1)在DrawerLayout中,第一个子View必须是显示内容的view,并且设置它的layout_width和layout_height属性是match_parent.
2)第二个view是抽屉view,并且设置属性layout_gravity="left|right",表示是从左边滑出还是右边滑出。设置它的layout_height="match_parent"
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawerlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="content" />
<ListView
android:id="@+id/listview"
android:layout_width="80dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:background="#FFB5C5" />
</android.support.v4.widget.DrawerLayout>
在第二个View中设置背景
‘伍’ android怎么禁止drawlayout拉出
android实现禁止drawlayout拉出
工具
Toolbar
方法
1. ActionBar替换设置
values下设置styles.xml 为NoActionBar
‘陆’ 简书· Android 中 DrawerLayout + ViewPager 怎么解决滑动冲突
首先,要使用该控件就需要添加design library,在android studio(还没有使用Android studio的小伙伴们要赶紧更换啦)中添加依赖
compile ‘com.android.support:design:22.2.0’
然后再布局文件中使用TabLayout
<android.support.design.widget.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true" />12345
紧接着在下面添加ViewPager
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/tablayout" />12345
布局文件完成了,接下来去定义ViewPager中的适配器,这里我使用的是Fragment,所以继承自FragmentPagerAdapter ,代码如下:
public class MyPageAdapter extends FragmentPagerAdapter {
ArrayList<Fragment> datas;
ArrayList<String> titles;
public CommunityPageAdapter(FragmentManager fm) {
super(fm);
}
public void setData(ArrayList<Fragment> datas) {
this.datas = datas;
}
public void setTitles(ArrayList<String> titles) {
this.titles = titles;
}
@Override
public Fragment getItem(int position) {
return datas == null ? null : datas.get(position);
}
@Override
public int getCount() {
return datas == null ? 0 : datas.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles == null ? null : titles.get(position);
}
}
适配器中需要两个数据集合,分配填充Fragment和显示的标题。
然后在需要使用的页面添加如下代码:
MyPageAdapter myPageAdapter = new MyPageAdapter(getFragmentManager());
ArrayList<Fragment> datas = new ArrayList<Fragment>();
datas.add(new AFragment());
datas.add(new BFragment());
datas.add(new CFragment());
myPageAdapter.setData(datas);
ArrayList<String> titles = new ArrayList<String>();
titles.add("A");
titles.add("B");
titles.add("C");
myPageAdapter.setTitles(titles);12345678910111213
现在适配器和数据已经准备好了,那么接下来就是要把数据放入ViewPager中,并使ViewPager和TabLayout相关联:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tablayout);
ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
// 将适配器设置进ViewPager
viewPager.setAdapter(myPageAdapter);
// 将ViewPager与TabLayout相关联
tabLayout.setupWithViewPager(viewPager);123456
关联之后运行发现,其实ViewPager由于预加载机制,导致每次都会提前加载下一个页面,如果页面的数据量大,那么这将会占用大量的内存,有什么办法可以只加载当前显示的页面呢看
通过查找相关资料发现,有一个方法setOffscreenPageLimit(int),该方法的作用是设置提前加载页面的数量,尝试使用viewPager.setOffscreenPageLimit(0);后发现无效。
继续查阅资料后发现,原来这是由于ViewPager的机制导致的,最少需要预加载一个页面,Requested offscreen page limit 0 too small; defaulting to 1,相关问题链接:
发现了可以完美解决该问题的方法:
在Fragment中有一个方法,setUserVisibleHint,该方法可以获取当前页面的展示情况
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// 页面正在展示,在这里加载你的数据
}else{
// 页面没有展示
}
}12345678910
基本到这一步功能已经实现了,但是,还有一些细节需要注意,到底ViewPager滑动的时候为什么会造成TabLayout的标题也随之更换呢看原来setupWithViewPager被调用的时候,执行了下面的代码
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(this));
this.setOnTabSelectedListener(new TabLayout.(viewPager));
到最后,还有一个问题,那么就是如果我们的标题有多条,导致超出了TabLayout的显示范围,这该如何解决呢看很简单,查阅官方API发现,TabLayout有一个方法是setTabMode,它是用来设置TabLayout的展示模式,而这个方法接受两个常量,MODE_SCROLLABLE 以及 MODE_FIXED,显而易见,当我们设置为MODE_SCROLLABLE 它就能自动根据标题的数量,滑动展示啦,功能到这里就完美实现了!
‘柒’ android编程Drawerlayout问题
packagecom.xiaolangcai.lasttime;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.app.ActionBar;
importandroid.app.Fragment;
importandroid.app.FragmentManager;
importandroid.os.Bundle;
importandroid.support.v4.app.FragmentActivity;
importandroid.support.v4.widget.DrawerLayout;
importandroid.view.LayoutInflater;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.view.ViewGroup;
importandroid.widget.AdapterView;
importandroid.widget.AdapterView.OnItemClickListener;
importandroid.widget.ArrayAdapter;
importandroid.widget.Button;
importandroid.widget.ListView;
importandroid.widget.TextView;
importandroid.os.Build;
{
privateButtonmDrawerButton;
privateTextViewtitle;
;
privateListViewmDrawerList;
privateString[]menus;
privateList<Fragment>fragments;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
setAdapter();
setListener();
if(savedInstanceState==null){
getFragmentManager().beginTransaction()
.add(R.id.container,newPlaceholderFragment()).commit();
selectItem(0);
}
}
privatevoidsetListener(){
//TODOAuto-generatedmethodstub
mDrawerButton.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
if(mDrawerLayout.isDrawerOpen(mDrawerList)){
mDrawerLayout.closeDrawer(mDrawerList);
}else{
mDrawerLayout.openDrawer(mDrawerList);
}
}
});
mDrawerList.setOnItemClickListener(newOnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView<?>adapterView,Viewv,intposition,
longid){
selectItem(position);
}
});
}
privatevoidsetAdapter(){
//TODOAuto-generatedmethodstub
mDrawerList.setAdapter(newArrayAdapter<String>(this,R.layout.drawer_list_item,menus));
}
privatevoidinit(){
//TODOAuto-generatedmethodstub
mDrawerButton=(Button)findViewById(R.id.left);
title=(TextView)findViewById(R.id.title);
mDrawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
mDrawerList=(ListView)findViewById(R.id.drawer_list);
menus=newString[]{
"Home","Mercury","Venus","Mars","About","Setting"
};
fragments=newArrayList<Fragment>();
fragments.add(Homefragment.newInstance("Home"));
fragments.add(Mercuryfragment.newInstance("Mercury"));
fragments.add(Venusfragment.newInstance("Venus"));
fragments.add(Marsfragment.newInstance("Mars"));
fragments.add(Aboutfragment.newInstance("About"));
fragments.add(Settingfragment.newInstance("Setting"));
}
privatevoidselectItem(inti){
//TODOAuto-generatedmethodstub
Fragmentfragment=fragments.get(i);
FragmentManagermanager=getFragmentManager();
manager.beginTransaction().replace(R.id.content_frame,fragment).commit();
title.setText(menus);
mDrawerList.setItemChecked(i,true);
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
(Menumenu){
//Inflatethemenu;.
getMenuInflater().inflate(R.menu.main,menu);
returntrue;
}
@Override
(MenuItemitem){
//Handleactionbaritemclickshere.Theactionbarwill
///Upbutton,solong
//.xml.
intid=item.getItemId();
if(id==R.id.action_settings){
returntrue;
}
returnsuper.onOptionsItemSelected(item);
}
/**
*.
*/
{
publicPlaceholderFragment(){
}
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
ViewrootView=inflater.inflate(R.layout.fragment_main,container,
false);
returnrootView;
}
}
}
‘捌’ android中我使用了drawerlayout实现侧滑菜单,主界面是一个listview,为什么
给侧滑菜单布局添加属性android:clickable="true"
‘玖’ android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕
布局文件中使用drawerLayout ,下面包含两个区,主内容区的布局代码要放在侧滑菜单布局的前面,侧滑菜单的部分的布局可以设置layout_gravity属性来表示在左边还是右边。
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
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" />
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
看代码很清楚,但是如果说要让侧滑出来的菜单内容占满整个屏幕的话,需要自己知道屏幕的width,ListView也就是菜单布局width设置一样就可以了(不过设置为math_parent也大概只占了百分之90左右,并不能完全覆盖掉)。
‘拾’ android编程Drawerlayout布局中加入activity
一般如此,但也可以不用layout布局,而直接在activity中用java代码进行布局。 另外,一个layout布局,也可以被多个activity使用。