Android 动作模式激活时防止后退按钮

Android 动作模式激活时防止后退按钮,android,android-actionbar,android-toolbar,android-actionbar-compat,android-actionmode,Android,Android Actionbar,Android Toolbar,Android Actionbar Compat,Android Actionmode,下面链接的问题中的程序在标准或支持操作模式下似乎都不适用于我。虽然ACTION_UP不会显示为参数,但ACTION_DOWN不会显示为参数,但无论如何,ActionMode仍会被取消 有人能建议如何防止按下后退键时动作模式关闭吗 我的代码 import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import andr

下面链接的问题中的程序在标准或支持操作模式下似乎都不适用于我。虽然ACTION_UP不会显示为参数,但ACTION_DOWN不会显示为参数,但无论如何,ActionMode仍会被取消

有人能建议如何防止按下后退键时动作模式关闭吗

我的代码

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class test extends AppCompatActivity  {

Toolbar toolbar;
Button standard;
Button support;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    toolbar= (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    standard= (Button) findViewById(R.id.standard);
    standard.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActionMode(standardCallback);
            standard.setVisibility(View.GONE);
            support.setVisibility(View.GONE);
        }
    });

    support= (Button) findViewById(R.id.support);
    support.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startSupportActionMode(supportCallback);
            standard.setVisibility(View.GONE);
            support.setVisibility(View.GONE);
        }
    });

}

private android.view.ActionMode.Callback standardCallback=new android.view.ActionMode.Callback() {
    @Override
    public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
        mode.setTitle("Standard Action Mode Enabled");
        return true;
    }

    @Override
    public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
        return false;
    }

    @Override
    public void onDestroyActionMode(android.view.ActionMode mode) {
        standard.setVisibility(View.VISIBLE);
        support.setVisibility(View.VISIBLE);
    }
};

//requires theme entry: <item name="windowActionModeOverlay">true</item>
private android.support.v7.view.ActionMode.Callback supportCallback=new android.support.v7.view.ActionMode.Callback() {
    @Override
    public boolean onCreateActionMode(android.support.v7.view.ActionMode mode, Menu menu) {
        mode.setTitle("Support Action Mode Enabled");
        return true;
    }

    @Override
    public boolean onPrepareActionMode(android.support.v7.view.ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(android.support.v7.view.ActionMode mode, MenuItem item) {
        return false;
    }

    @Override
    public void onDestroyActionMode(android.support.v7.view.ActionMode mode) {
        standard.setVisibility(View.VISIBLE);
        support.setVisibility(View.VISIBLE);
    }
};

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
            // handle your back button code here
            Toast.makeText(this,"Back ACTION_UP",Toast.LENGTH_LONG).show();
            return true; // consumes the back key event - ActionMode is not finished
        }

    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
        // handle your back button code here
        Toast.makeText(this,"Back ACTION_DOWN",Toast.LENGTH_LONG).show();
        return true; // consumes the back key event - ActionMode is not finished
    }

    return super.dispatchKeyEvent(event);
}
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入android.support.v7.widget.Toolbar;
导入android.view.KeyEvent;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.widget.Button;
导入android.widget.Toast;
公共类测试扩展了AppCompatActivity{
工具栏;
按钮标准;
按钮支架;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
toolbar=(toolbar)findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
标准=(按钮)findViewById(R.id.standard);
standard.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
startActionMode(标准回调);
标准.设置可见性(视图.消失);
support.setVisibility(View.GONE);
}
});
支持=(按钮)findViewById(R.id.support);
support.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
startSupportActionMode(支持回调);
标准.设置可见性(视图.消失);
support.setVisibility(View.GONE);
}
});
}
私有android.view.ActionMode.Callback standardCallback=新的android.view.ActionMode.Callback(){
@凌驾
公共布尔onCreateActionMode(android.view.ActionMode模式,菜单){
mode.setTitle(“标准动作模式启用”);
返回true;
}
@凌驾
公共布尔onPrepareActionMode(android.view.ActionMode模式,菜单){
返回false;
}
@凌驾
已单击的公共布尔OnActionItem(android.view.ActionMode模式,菜单项){
返回false;
}
@凌驾
public void onDestroyActionMode(android.view.ActionMode){
标准.setVisibility(视图.VISIBLE);
support.setVisibility(View.VISIBLE);
}
};
//需要主题条目:true
私有android.support.v7.view.ActionMode.Callback-supportCallback=new-android.support.v7.view.ActionMode.Callback(){
@凌驾
公共布尔onCreateActionMode(android.support.v7.view.ActionMode模式,菜单){
mode.setTitle(“支持操作模式已启用”);
返回true;
}
@凌驾
公共布尔onPrepareActionMode(android.support.v7.view.ActionMode模式,菜单){
返回false;
}
@凌驾
公共布尔值onActionItemClicked(android.support.v7.view.ActionMode,菜单项){
返回false;
}
@凌驾
public void onDestroyActionMode(android.support.v7.view.ActionMode){
标准.setVisibility(视图.VISIBLE);
support.setVisibility(View.VISIBLE);
}
};
@凌驾
公共布尔dispatchKeyEvent(KeyEvent事件){
if(event.getKeyCode()==KeyEvent.KEYCODE\u BACK&&event.getAction()==KeyEvent.ACTION\u UP){
//在这里处理后退按钮代码
Toast.makeText(这是“后退动作”,Toast.LENGTH.show();
return true;//使用返回键事件-ActionMode未完成
}
if(event.getKeyCode()==KeyEvent.KEYCODE\u返回和&event.getAction()==KeyEvent.ACTION\u向下){
//在这里处理后退按钮代码
Toast.makeText(这是“后退动作”,Toast.LENGTH.show();
return true;//使用返回键事件-ActionMode未完成
}
返回super.dispatchKeyEvent(事件);
}
}

布局

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

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?android:attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

<Button
    android:id="@+id/standard"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="30dp"
    android:text="Standard"/>

<Button
    android:id="@+id/support"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="30dp"
    android:text="Support"/>

</LinearLayout>


我通过使用支持库中的工具栏模拟动作模式栏解决了这个问题。

我通过使用支持库中的工具栏模拟动作模式栏解决了这个问题。

我遇到了这个问题,我通过将
AppCompatActivity
更改为
Activity
解决了这个问题。我不知道为什么,但在actionMode工作时,在
AppCompatActivity
中,它不会读取
KeyEvent.ACTION\u UP
。但是在
Activity
中它确实存在。

我遇到了这个问题,我通过将
AppCompatActivity
更改为
Activity
解决了这个问题。我不知道为什么,但在actionMode工作时,在
AppCompatActivity
中,它不会读取
KeyEvent.ACTION\u UP
。但是在
Activity
中确实如此。

您的意思是将自定义视图设置为ActionMode?哪个是工具栏?你能再清楚一点吗?我也面临同样的问题。你是说将自定义视图设置为ActionMode?哪个是工具栏?你能再清楚一点吗?我也面临同样的问题。