Восстановить фокус на представления в диалоге после изменения ориентации - PullRequest
2 голосов
/ 10 февраля 2012

Я использую One Gulli Bulls Изменение ориентации экрана - сохранение фокуса * Пример 1002 * для восстановления фокуса при изменении ориентации.

Моя активность AddGearbox и открывает диалоговое окно CustomizeDialog (активность с theme.dialog).

В диалоговом окне есть несколько текстовых полей. В onSaveInstanceState я сохраняю то, что мне нужно, и могу восстановить его в restoreDialog. Но фокус не восстанавливается.

Я регистрирую идентификатор представления, которое имеет фокус при изменении ориентации, но я предполагаю, что представление находится в активности, показывающей диалог, а не в самом диалоге?

Что делать?

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);
...