【问题标题】:How to close Drawer layout on BackPress in Android?如何在 Android 的 BackPress 上关闭抽屉布局?
【发布时间】:2020-02-08 05:21:51
【问题描述】:

我按下导航抽屉,然后如果我按下返回按钮,应用程序将退出而不是返回到上一个活动。如果我更改 xml 文件,则不会出现此问题。所以我认为问题出在xml文件中。谁能告诉我有什么问题? 这是xml代码。`

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="500dp"
    android:layout_height="200dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:src="@drawable/blue_train" />

<TextView
    android:id="@+id/trainName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_marginBottom="200dp"
    android:layout_marginLeft="14dp"
    android:text="Train Name"
    android:textColor="@color/bluedark"
    android:textSize="15sp" />

<EditText
    android:id="@+id/etName"
    android:layout_width="150dp"
    android:layout_height="40dp"
    android:layout_alignBaseline="@+id/trainName"
    android:layout_alignBottom="@+id/trainName"
    android:layout_marginLeft="30dp"
    android:layout_toRightOf="@+id/trainName"
    android:background="@drawable/line"
    android:ems="10" >

    <requestFocus />
</EditText>

<Button
    android:id="@+id/getS"
    android:layout_width="150dp"
    android:layout_height="wrap_content"
    android:layout_below="@+id/etName"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="40dp"
    android:background="@drawable/button2"
    android:text="Get Train Schedule"
    android:textColor="@color/white" />

`

【问题讨论】:

  • 当你说你改变了 XML 并且问题消失了 - 你用什么方式改变它?
  • 我发现,如果我删除 EditText,它会起作用。但是为什么当我有 EditText 时它不起作用?
  • 因为EditText在请求焦点,如果EditText没有焦点,则没有问题

标签: android


【解决方案1】:

这将在抽屉打开并按下返回时关闭抽屉,而不是让您回到上一个活动(或退出)。

DrawerLayout drawer...

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub

    if(drawer.isDrawerOpen(Gravity.LEFT)){
        drawer.closeDrawer(Gravity.LEFT);
    }else{
        super.onBackPressed();
    }
}

【讨论】:

  • 您也可以为多个抽屉执行此操作。 if(drawer.isDrawerOpen(Gravity.RIGHT)) 抽屉.closeDrawer(Gravity.RIGHT);
【解决方案2】:
ListView mDrawerList;

@Override
public void onBackPressed() {
// TODO Auto-generated method stub

if(mDrawerLayout.isDrawerOpen(mDrawerList)){
    mDrawerLayout.closeDrawer(mDrawerList);
}else{
    super.onBackPressed();
}
}

【讨论】:

    【解决方案3】:

    我是这样做的:

    private DrawerLayout mDrawerLayout;
    

    onCreate()

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);  
    mDrawerLayout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
    

    希望这会对你有所帮助。

    【讨论】:

      【解决方案4】:

      @Hiren Patel 的回答是迄今为止最优雅的,但你应该设置:

      mDrawerLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
      

      或者

      mDrawerLayout.descendantFocusability = ViewGroup.FOCUS_BEFORE_DESCENDANTS
      

      只是为了不阻止其他子视图接收焦点,从而阻止例如软键盘。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-04
        • 1970-01-01
        • 2017-01-22
        • 1970-01-01
        • 2020-09-23
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        相关资源
        最近更新 更多