标签: drawerlayout

如何以编程方式创建DrawerLayout

我想在我的主要活动中将这个xml翻译成java,输出是导航抽屉.我只需要帮助这一部分,我完成了剩下的部分.

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

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

<ListView
    android:id="@+id/drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#FFF"
    android:choiceMode="singleChoice"/>
Run Code Online (Sandbox Code Playgroud)

我想在java代码中写上面的xml,怎么样?

提前致谢

更新

final DrawerLayout drawer = new android.support.v4.widget.DrawerLayout(this);
     final FrameLayout fl = new FrameLayout(this);
     fl.setId(CONTENT_VIEW_ID);
     final ListView navList = new ListView (this);

     drawer.addView(fl, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
     drawer.addView(navList);

     setContentView(drawer);
Run Code Online (Sandbox Code Playgroud)

我需要一些帮助来在代码中自定义listview的布局宽度和布局重力.

android listview drawerlayout

6
推荐指数
1
解决办法
7604
查看次数

抽屉布局采用触摸事件而不是导航窗格的元素

我的 Android 项目包含 2 个导航抽屉。一个从右侧开始,另一个从左侧开始。单击按钮即可打开它:

if (mDrawerLayout.isDrawerOpen(mRightDrawerView))
    mDrawerLayout.closeDrawer(mRightDrawerView);
mDrawerLayout.openDrawer(mLeftDrawerView);
Run Code Online (Sandbox Code Playgroud)

两个抽屉都有自定义布局,使用以下方式定义:

<?xml version="1.0" encoding="utf-8"?>
<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/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<include
    android:id="@+id/left_drawer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    layout="@layout/menu_panel" />

<include
    android:id="@+id/right_drawer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="end"
    layout="@layout/search_panel" />

</android.support.v4.widget.DrawerLayout> 
Run Code Online (Sandbox Code Playgroud)

问题是:当我打开抽屉并尝试捕获其单击事件时,(抽屉布局中有按钮和文本视图)抽屉会关闭而不是响应单击事件。

我也用过:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
mDrawerLayout.requestDisallowInterceptTouchEvent(true);
Run Code Online (Sandbox Code Playgroud)

我不希望抽屉在其内部的触摸事件发生时关闭。

我还尝试更改抽屉布局的“可点击”属性。但没有用。

非常感谢任何帮助。谢谢

android android-layout navigation-drawer drawerlayout

6
推荐指数
1
解决办法
2215
查看次数

使用NavigationView的DrawerLayout - 未在点击上显示涟漪效应

我在抽屉上看到可以看到点击效果的问题.

我有活动xml布局如下:

    <?xml version="1.0" encoding="utf-8"?>
<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"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <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:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer"/>

</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

你可以看到我放入NavigationView我的DrawerLayout然后NavigationView使用菜单xml文件填充.

activity_main_drawer.xml看起来如下:

<menu
xmlns:android="http://schemas.android.com/apk/res/android"
>
<group>
    <item
        android:id="@+id/id1"
        android:title="Item 1"/>
    <item
        android:id="@+id/id2"
        android:title="Item 2"/>
    <item
        android:id="@+id/id3"
        android:title="Item 3"/>
    <item
        android:id="@+id/id4"
        android:title="Item 4"/>
</group>
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我这样做时,我点击该抽屉菜单中的项目后没有任何视觉效果.我想要的是所谓的"涟漪效应".我该怎么做?

android navigation-drawer drawerlayout navigationview android-navigationview

6
推荐指数
1
解决办法
909
查看次数

从导航抽屉布局中删除间隙

我创建了一个具有导航视图的应用程序。

当应用程序全屏显示时,我打开导航视图,它向我显示导航视图顶部的黑色覆盖层,并显示屏幕底部和导航视图底部之间的间隙。为了那个原因。

  • xml代码
<?xml version="1.0" encoding="utf-8"?>

<androidx.drawerlayout.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"
    tools:openDrawer="start">

    ...

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        tools:ignore="RtlSymmetry">

        <!--PlayList Layout-->
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rcvVideoPlaylist"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical"
            android:fitsSystemWindows="false"
            tools:listitem="@layout/item_video_playlist" />

    </com.google.android.material.navigation.NavigationView>

</androidx.drawerlayout.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
  • 用于全屏代码
view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

Run Code Online (Sandbox Code Playgroud)

任何人都给我解决方案从导航视图中删除该叠加层和导航视图中的间隙

android navigation-drawer drawerlayout

6
推荐指数
1
解决办法
508
查看次数

带导航组件的抽屉布局 - 仅监听一项

我有一个关于实现带有导航组件的抽屉布局的问题。

我已经使用 Android Studio 的包含导航抽屉活动创建了抽屉布局。

实际上,如果菜单项的目的是更改导航 XML 中定义的片段或活动(如屏幕截图上的程序、歌曲、设置等),那么一切都很好

一切都很好 --> 片段正在改变

val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
    val navView: NavigationView = findViewById(R.id.nav_view)
    val navController = findNavController(R.id.nav_host_fragment)
    // Passing each menu ID as a set of Ids because each
    // menu should be considered as top level destinations.
    appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.nav_user_programs_list,
            R.id.nav_user_songs_list,
            R.id.nav_user_settings,
            R.id.nav_user_legal_notices,
            R.id.nav_games
        ), drawerLayout
    )
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)
Run Code Online (Sandbox Code Playgroud)

但是,我还想在“注销”菜单项上执行注销操作而不启动另一个片段或活动:

注销对话框单击注销菜单项 --> 片段无变化

我设法这样做:

navView.setNavigationItemSelectedListener {
        if (it.itemId == R.id.nav_logout) {
            logoutUser()
        }
        true
    }
Run Code Online (Sandbox Code Playgroud)

但我的问题是:使用该方法,所有其他曾经工作(更改片段)的项目不再工作,因为它调用了 NavigationItemSelectedListener,在这种情况下它什么都不做。

有没有结合这两种方法的解决方案?:

  • 使用android studio的默认抽屉布局更改片段
  • 使用 NavigationItemSelectedListener 仅对一个菜单项执行操作。

我希望它足够清楚。如果您需要精度,请不要犹豫。 …

android drawerlayout android-architecture-navigation

6
推荐指数
1
解决办法
711
查看次数

SlidingPaneLayout和NavigationDrawer之间的区别

我真的不知道这两种创建导航菜单的方法有什么区别.所以我读到两者都可以用作两个片段的容器(主片段,细节片段).那么你能帮我理解哪种方法更好,为什么?我找不到相关信息.

谢谢.

android drawerlayout

5
推荐指数
2
解决办法
5624
查看次数

没有支持库的DrawerLayout用于MinSDK> = 15

为什么DrawerLayout仅在支持库中可用而不在标准API中?

我试图将它包含在minSDK 15的项目中,而Android Studio无法解析该类.使用v4支持库进行编译虽然做到了,但我想知道为什么会这样.

android drawerlayout

5
推荐指数
0
解决办法
825
查看次数

DrawerLayout中的按钮不可点击

我一直在寻找这个问题,但我还是找不到解决方案.对于我的DrawerLayout设计,我不会使用listview而是使用linearlayout作为我的视图的容器.我首先通过在linearlayout中添加一个按钮来测试它,但我无法点击它.继承了XML.

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

<LinearLayout
        android:id="@+id/left_drawer"
        android:background="@color/white"
        android:orientation="vertical"
        android:layout_gravity="start"
        android:layout_width="250dp"
        android:layout_height="match_parent">
    <Button
            android:id="@+id/btn_test"
            android:text="TEST"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    <EditText

            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

</LinearLayout>

<FrameLayout
        android:id="@+id/container_fragment2"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginTop="1dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        >
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

在java中,我还尝试在按钮加载和工作后将文本放在按钮中.唯一不起作用的是我点击它.抽屉就会关闭.

/**Init Drawer*/
private void initDrawer(){

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerContainer = (LinearLayout) findViewById(R.id.left_drawer);

    //mDrawerContainer.setOnClickListener(new DrawerItemClickListener());
    mDrawerContainer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(context,"initDrawer",Toast.LENGTH_SHORT).show();
        }
    });

    btn_test = (Button)mDrawerContainer.findViewById(R.id.btn_test);
    btn_test.setOnClickListener(new View.OnClickListener() { //this is not working,i cant click the button
        @Override
        public void onClick(View v) { …
Run Code Online (Sandbox Code Playgroud)

android button android-linearlayout drawerlayout

5
推荐指数
2
解决办法
2602
查看次数

使用Android设计支持库中的NavigationView

我正在尝试按照本教程使用设计支持库中的新DrawerLayout.

似乎Android工作室没有识别NavigationView布局.

这是我的main_activity布局:

<android.support.v4.widget.DrawerLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:fitsSystemWindows="true">

   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:padding="20dp">
       <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="Hello"/>
   </LinearLayout>

<android.support.design.widget.NavigationView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/drawer_header"
    app:menu="@menu/drawer_menu"/>
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

当我试图运行该项目时,我收到了下一个错误:

错误:(19)找不到属性'headerLayout'的资源标识符

但我确实有这个drawer_header xml文件

android android-support-library android-studio drawerlayout navigationview

5
推荐指数
1
解决办法
6212
查看次数

当DrawerLayout关闭时,RecyclerView变得聚焦

这是我发现的一种奇怪的错误.

但是,如果我在片段中有一个RecyclerView,然后打开然后关闭我的DrawerLayout,我的RecyclerView成为焦点.这意味着关闭我的DrawerLayout将导致ScrollView跳转到我的RecyclerView.显然,我希望ScrollView的位置在DrawerLayout关闭时不会移动,并且绝对不能在我的RecyclerView上找到.


在我的应用程序中,我有ScrollViews中包含的RecyclerViews,类似于此设置:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <RelativeLayout
            android:layout_alignParentTop="true"
            android:layout_width="match_parent"
            android:layout_height="180dp">

            <android.support.v7.widget.AppCompatImageView
                android:id="@+id/header_photo"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:adjustViewBounds="true"
                android:tint="#80000000"
                android:scaleType="centerCrop"/>

            <LinearLayout
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_centerHorizontal="true">

                <TextView android:id="@+id/header_text"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:gravity="center"
                    android:paddingTop="2dp"
                    android:paddingBottom="2dp"
                    android:textColor="@color/text_SecondaryColor"
                    android:textSize="@dimen/header_xxlarge"/>

                <View android:id="@+id/divider"
                    android:layout_width="0dp"
                    android:layout_height="@dimen/hr_thick"
                    android:background="@color/accent_PrimaryColor"/>
            </LinearLayout>
        </RelativeLayout>

        <LinearLayout
            android:orientation="vertical"
            android:layout_margin="20dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerview"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

            <Button android:id="@+id/button_more"
                android:layout_marginTop="6dp"
                android:layout_marginBottom="6dp"
                android:layout_width="400px"
                android:layout_height="100px"
                android:layout_gravity="center"
                android:gravity="center"
                android:background="@drawable/button_dark"
                android:textColor="@drawable/button_dark_textcolor"/>
        </LinearLayout>
    </LinearLayout>
</ScrollView>
Run Code Online (Sandbox Code Playgroud)

我的DrawerLayout的XML设计安排如下:

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <include
                android:layout_height="wrap_content"
                android:layout_width="match_parent" …
Run Code Online (Sandbox Code Playgroud)

java android drawerlayout android-recyclerview

5
推荐指数
1
解决办法
236
查看次数