View.OnKeyListener
ユーザーが戻るボタンを押してダイアログをポップアップするときにキャッチできるように実装されたアクティビティがあります。以前は、問題なく動作していました。しかし最近、それが機能しなくなり、アプリはonKey
[戻る] ボタンをキャッチする方法がないように見せかけるだけでした。onKey
変更を加えてからメソッドにほとんど触れていないため、理由がわからないようです。代わりに使用してみOnBackPressed()
ましたが、何も解決せず、実際には奇妙で予測不可能な動作が発生しました。私のアプリがシステムに戻るボタンの支配を任せているように見える理由を理解するのを手伝ってくれる人はいますか?
私の実装の重要な部分は次のとおりです。
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.MenuInflater;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.KeyEvent;
import android.view.View;
public class NagTasksAddTasksActivity extends SherlockFragmentActivity implements View.OnKeyListener {
//various parameters
public void onCreate(Bundle savedInstanceBundle)
{
super.onCreate(savedInstanceBundle);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
String setTheme = prefs.getString("themeselect", "Dark Overflow");
if (setTheme.toLowerCase().contentEquals("dark overflow")){
setTheme(R.style.Theme_Sherlock_ForceOverflow);
} else if (setTheme.toLowerCase().contentEquals("light overflow")){
setTheme(R.style.Theme_Sherlock_Light_ForceOverflow);
isDarkThemeUsed = false;
} else if (setTheme.toLowerCase().contentEquals("dark menu")){
setTheme(R.style.Theme_Sherlock);
} else if (setTheme.toLowerCase().contentEquals("light menu")){
setTheme(R.style.Theme_Sherlock_Light);
isDarkThemeUsed = false;
}
setContentView(R.layout.createtasklayout);
ActionBar actionBar = getSupportActionBar();
setTitle(R.string.newTask);
}
...
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(true);
builder.setTitle(R.string.wait);
builder.setMessage(R.string.confirmbackkey);
builder.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//stuff
dialog.dismiss();
}
});
builder.setNegativeButton(R.string.discard, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
AlertDialog.Builder subBuilder = new AlertDialog.Builder(getParent());
subBuilder.setCancelable(true);
subBuilder.setTitle(R.string.wait);
subBuilder.setMessage(R.string.confirmdiscard);
subBuilder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//more stuff
dialog.dismiss();
}
});
subBuilder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
dialog.dismiss();
subBuilder.create().show();
}
});
builder.setNeutralButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.create().show();
return true;
}
return false;
}
}