2014-09-20 5 views
0

У меня возникает неприятная проблема с диалоговымфрагментом при изменении ориентации экрана. Объект-член (TextView) становится нулевым, когда я использую его в обработчике, но он был завышен и назначен в onCreateView после поворота экрана.Элементы DialogFragment становятся нулевыми после поворота экрана

В принципе, у меня есть кнопка в диалоговом окне, чтобы пользователи могли выбирать файл из другого вида деятельности. После этого выбранный путь к файлу будет напечатан в текстовом виде.

Так у меня есть:

mHandler = new Handler(); 

public View onCreateView(...) { 
    View rootView = .... 
    mPathView = (TextView)rootView.findViewById(...); 
    Log.d("test", String.format("%s", mPathView.toString()); 
    ... 
} 

И у меня есть метод, который вызывается в onActivityResult прикрепленного деятельности:

public void onFileSelected(...) { 
    if(reqeustCode==Activity.RESULT_OK) { 
     ... 
     mHandler.post(new Runnable() { 
      public void run() { 
       Log.d("test", String.format("mPathView==null:%b", mPathView==null)); 
       if(mPathView!=null) { 
        mPathView.setText(path); 
       } 
      } 
     } 
     return; 
    } 
    //Error handling here 
} 

Если я проверяю LogCat, я могу увидеть что-то вроде:

09-20 16:13:51.264:  test [email protected] 
09-20 16:13:52.412:  test [email protected] (after rotation) 
09-20 16:13:56.129:  test mPathView==null: true (after file selected) 

Я попытался сохранитьInstance в onCreate, но это не решило этот плюс cing new problem: имя сохраненногоInstanceState всегда равно null в onCreateView.

Я также знаю, что экземпляр воссоздается после поворота экрана. Но я не понимаю, что после повторного создания, mPathView назначается (как указано в logcat log).

Я подозреваю, что это как-то связано с повторным созданием активности, потому что у меня есть экземпляр диалогового окна, созданного в onCreate в Activity ... поэтому в onActivityResult ссылка на диалог больше не отображается , Но в это время я не проверил его и не получил хорошей идеи сохранить экземпляр диалога.

Я прочитал довольно некоторое сообщение в StackOverflow, но все равно не могу заставить его работать ... Любая помощь очень ценится!

ответ

0

Теперь я проверил, что я подозревал, и это причина.

Так что я к написал некоторые не красивый код, чтобы сделать его работу: В своей деятельности я добавил метод

public void setDialogInstance(FileSelectDialog dialog) { 
    mDialog = dialog; 
} 

И в FileSelectDialog, я переопределить onActivityCreated метод

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(..); 
    try { 
     MainActivity host = (MainActivity)getActivity(); 
     host.setDialogInstance(this); 
    } catch(ClassCastException e) {} 
} 

Сначала я попытался вызвать метод setDialogInstance в методе onAttach, но только чтобы найти его до начала операции onCreate.

Я думаю, может быть, интерфейс можно ввести так, чтобы DialogFragment не нуждался в специфической деятельности хоста.

Смежные вопросы