One Gulli Bulls Screen Orientation Change – Saving Focusの例を使用して、向きが変わったときにフォーカスを取り戻します。
マイ アクティビティAddGearbox
で、ダイアログが開きますCustomizeDialog
(アクティビティでtheme.dialog
)。
ダイアログにはいくつかのテキストボックスがあります。でonSaveInstanceState
必要なものを保存し、で復元できrestoreDialog
ます。しかし、焦点は元に戻りません。
向きが変わったときにフォーカスがあるビューの ID をログに記録していますが、そのビューはダイアログ自体ではなく、ダイアログを表示しているアクティビティにあると思いますか?
何をすべきか?
AddGearbox.java
public class AddGearbox extends FragmentActivity implements
MyListFragment.MyOnClickSelectedListener, DialogInterface.OnDismissListener {
CustomizeDialog customizeDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
customizeDialog = new CustomizeDialog(this);
if(savedInstanceState!=null) {
restoreDialog(savedInstanceState);
}
}
....
....
....
@Override
protected void onSaveInstanceState(Bundle saveState) {
super.onSaveInstanceState(saveState);
saveState.putBoolean("isDialogOpen",isDialogOpen);
if (isDialogOpen) {
// Save a lot of stuff
View focusedChild = getCurrentFocus();
if (focusedChild != null)
{
int focusID = focusedChild.getId();
int cursorLoc = 0;
if (focusedChild instanceof EditText)
{
cursorLoc = ((EditText) focusedChild).getSelectionStart();
}
saveState.putInt("focusID", focusID);
saveState.putInt("cursorLoc", cursorLoc);
}
}
}
private void restoreDialog(Bundle savedInstanceState) {
isDialogOpen=savedInstanceState.getBoolean("isDialogOpen");
if (isDialogOpen) {
customizeDialog = new CustomizeDialog(this);
// Restore a lot of stuff
int focusID = savedInstanceState.getInt("focusID", View.NO_ID);
View focusedChild = findViewById(focusID);
if (focusedChild != null) {
focusedChild.requestFocus();
if (focusedChild instanceof EditText) {
int cursorLoc = savedInstanceState.getInt("cursorLoc", 0);
((EditText) focusedChild).setSelection(cursorLoc);
}
}
customizeDialog.show();
}
CustomizeDialog.java
public class CustomizeDialog extends Dialog implements OnClickListener {
public CustomizeDialog(AddGearbox mainActivity) {
super(mainActivity);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.customizedialog);