在android中制作一个RTL导航抽屉

2024-01-02

我想让我的导航从以下位置打开right to left。但是,一旦我更改这些步骤中的任何一个,我的程序就会在运行应用程序后单击导航后面临错误强制关闭。

我的 main_activity.xml

<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" />

我的custom_toolbar.xml

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_gravity="right"
    android:background="@color/colorPrimary">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="title"
        android:padding="8dp"
        android:textColor="#fff"
        android:textSize="18sp"
        />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/cnews"
        android:tint="#fff"
        android:layout_gravity="right"
        />
</android.support.v7.widget.Toolbar>


//content
<include layout="@layout/content_main" /> </LinearLayout>

我的appbar_main.xml

<include layout="@layout/toolbar_main" />

我的 main_activity.java

import android.app.FragmentManager; import android.os.Bundle;  import android.support.design.widget.NavigationView;  import android.support.v4.view.GravityCompat;  import android.support.v4.widget.DrawerLayout;  import android.support.v7.app.ActionBarDrawerToggle;   import android.support.v7.app.AppCompatActivity;   import android.support.v7.widget.Toolbar; import android.view.Menu;   import android.view.MenuItem;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.home_page) {
            Home_page_fragment homeFragment = new Home_page_fragment();
            FragmentManager manager = getFragmentManager();
            manager.beginTransaction().replace(R.id.mainContent , homeFragment, homeFragment.getTag()).commit();
        } else if (id == R.id.tour_page) {
            Tour_page_fragment tourFragment = new Tour_page_fragment();
            FragmentManager manager = getFragmentManager();
            manager.beginTransaction().replace(R.id.mainContent , tourFragment, tourFragment.getTag()).commit();

        } else if (id == R.id.lstour_page) {
            LsTour_page_fragment LstourFragment = new LsTour_page_fragment();
            FragmentManager manager = getFragmentManager();
            manager.beginTransaction().replace(R.id.mainContent , LstourFragment, LstourFragment.getTag()).commit();

        } else if (id == R.id.hotel_page) {

        } else if (id == R.id.agency_page) {

        } else if (id == R.id.news_page) {

        }else if (id == R.id.logbook_page) {

        }else if (id == R.id.message_page) {

        }else if (id == R.id.favorite_page) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    } }

我变了"Start" to "end" in .xml主要活动和java主要活动强制关闭!

我将“开始”更改为“正确”强制关闭!

I used RTL library但再次被强制关闭!

提前致谢。


问题是您自定义的 Gravity 未定义并返回 NULL。 首先,您应该更新您的menu.xml并构建一个项目作为右侧菜单的图标,如下所示:

<item
        android:id="@+id/menu_right"
        android:orderInCategory="100"
        android:showAsAction="always"
        android:icon="@android:drawable/ic_dialog_dialer"
        android:title="@string/action_menuright"
/>

And in main_activity.java禁用从左侧打开的默认切换抽屉并更新:

toggle.syncState();
toggle.setDrawerIndicatorEnabled(false);//this is added line

并类似地更新这个:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {
         <   here:  add this line:  >
    DrawerLayout drawer;

最后将这个类更改为:

public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    // noinspection SimplifiableIfStatement
    if (id == R.id.menu_right) {
        if(drawer.isDrawerOpen(Gravity.RIGHT) ) {
             drawer.closeDrawer(Gravity.RIGHT);
        }
        else{
             drawer.openDrawer(Gravity.RIGHT);
        }
        return true;
    }

    return super.onOptionsItemSelected(item);
}

现在一切都很好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在android中制作一个RTL导航抽屉 的相关文章

随机推荐

  • 微服务和 Spring Security OAuth2

    我已经在另一个项目中运行了 OAuth2 授权服务器 现在我需要使用 OAuth2 保护几个简单的 spring boot Rest servers 但我正在寻找Spring文档 http projects spring io spring
  • 使用 SMO 编写部分数据内容的脚本(仅匹配 WHERE 子句的行)

    我使用 SMO 用 SQL Server 数据库的数据填充 SQL Compact 数据库 这是我实际使用的代码 foreach Table l tblCurrent in l dbDatabase Tables if l tblCurre
  • 安装 Tensorflow 时出现问题——不是 CUDA/CuDNN 问题

    我最近开始使用 Tensorflow 但安装时遇到问题 每次我尝试导入它时都会收到以下错误 gt gt gt import tensorflow as tf Traceback most recent call last File C Us
  • 如何使用 numpy/scipy 处理丢失的数据?

    我在数据清理中最常处理的事情之一就是缺失值 R 使用其 NA 缺失数据标签很好地处理了这个问题 在Python中 看来我必须处理屏蔽数组 这似乎是设置的一个主要难题 而且似乎没有很好的文档记录 关于用 Python 简化这个过程有什么建议吗
  • 在asp.net服务器端代码中?

    我有这个代码 string s royi string val 5 我也有一个label
  • HTML/CSS 嵌套菜单下拉菜单

    我不明白如何为导航栏菜单创建嵌套下拉菜单 我想使用按钮和 div 而不是列表 链接 引导程序 我在这里构建了一些我认为正确的东西 但当然我无法让它工作 有人可以帮我让下拉菜单和嵌套下拉菜单正常工作吗 dropdown background
  • 使用 .NET 4.6.2 中的 HttpClientFactory

    我有一个 NET 4 6 2 控制台应用程序 使用简单注入器 我需要调用 HTTP 服务 直接使用 HttpClient 遇到问题后 我尝试使用 HttpClientFactory https github com aspnet HttpC
  • 链接器如何解析 C 中多重定义的全局符号

    我的教科书上是这么说的 函数和初始化的全局变量获得强符号 未初始化的全局变量获得弱符号 给定一个强符号和多个弱符号 选择强符号 所以我创建了两个文件来查看 file1 c int number int main int argc char
  • 与具有 10M 记录的 MySQL 相比,MongoDB 非常慢

    我有一个负载相当高的项目 在 MySQL 上运行 有大约 10M 条记录 每秒大约有 500 个请求 数据相当独特 缓存命中率只有3 左右 每行大约有 10 个字段 其中 2 个已建立索引 我的查询 99 使用这两个索引字段来请求 我决定尝
  • R 中的函数将小数转换为具有指定分母的分数

    假设我有一个小数列表 x lt c 0 55 0 246 0 767 然后我希望将这些转换成 10 以内的分数 这样我就得到 6 10 2 10 8 10 我遇到过这个 效果非常好 但是 我想知道是否有一个函数可以做到这一点 frac fu
  • 无需网络连接的桌面应用程序防止盗版?

    假设对于一个在其生命周期内永远不会接收互联网连接的应用程序 如何防止该软件的盗版 安装过程中不能有单一的产品密钥要求 因为一旦合法安装 任何人都可以复制安装并重新分发它 因此 每次应用程序运行时 它都应该检查某些内容 如果检查失败 则崩溃
  • 具有一个固定列宽的 Flexbox [重复]

    这个问题在这里已经有答案了 我正在努力实现flexbox有两列 左侧具有固定宽度 右侧随着页面大小的变化而缩放 例如 div class flex container div class flex col left div div
  • 即使特定日期没有数据,mysql日期列表也包含计数[重复]

    这个问题在这里已经有答案了 可能的重复 MySQL如何填充范围内缺失的日期 https stackoverflow com questions 3538858 mysql how to fill missing dates in range
  • 无需浏览器的 Selen 测试

    我使用 Selenium RC 进行测试 现在要执行负载测试 我想运行并行测试用例 有没有什么方法可以在不打开浏览器的情况下运行它们 Chrome 现在有无头模式 op webdriver ChromeOptions op add argu
  • Array.prototype.concat() 底层

    如何查看函数 concat 中的代码 它是如何做它所做的事情的 有人有代码的副本或在浏览器控制台中查看它的方法吗 console dir 不允许我访问过去 console dir Array prototype concat functio
  • 让 golang Gorilla CORS 处理程序工作

    我在这里有相当简单的设置 如下面的代码所述 但我无法得到CORS上班 我不断收到此错误 XMLHttpRequest 无法加载http localhost 3000 signup http localhost 3000 signup 响应
  • 无法以非 root 用户身份在 DockerFile 中解压缩 zip 文件

    当我尝试在 DockerFile 中解压 zip 文件时 不断收到以下错误 checkdir error cannot create my archive Permission denied unable to process my arc
  • Spring Data 似乎不理解@Column 名称

    我正在使用 Spring boot 1 4 1 RELEASE 以及 Spring Data 和 Hibernate 将一些数据保存到 MySQL 数据库中 我有这堂课Respondent 注释为 Entity以及注释如下的字段之一 Col
  • 如何在Python中使用win32gui关闭带句柄的窗口

    我已经通过 Python 中的 win32gui 库获得了我想要定位的窗口的句柄 我如何关闭窗口 我有以下代码 第二行做了我想做的事情 但最后一行似乎是错误的 handle win32gui FindWindow None r Notepa
  • 在android中制作一个RTL导航抽屉

    我想让我的导航从以下位置打开right to left 但是 一旦我更改这些步骤中的任何一个 我的程序就会在运行应用程序后单击导航后面临错误强制关闭 我的 main activity xml