2015-10-16 57 views
1

我在嘗試顯示自定義內容AlertDialog時遇到了一些奇怪的UI問題。該對話框要求用戶輸入一個名字,並且不允許他在沒有這樣做的情況下前進。這也是用戶在活動開始時看到的第一件事情。Android上的AlertDialog問題

有時候,在應用程序重新啓動後 - 比方說,當我打開對話框時按下主頁按鈕,然後重新打開應用程序,AlertDialog正在顯示,因爲它應該是,但父活動的佈局未加載正確。它實際上保留了用戶看到的前一個活動的佈局。更奇怪的是,這種佈局幾乎總是向後顯示。您可以在here中看到更好的效果。在對話框後面,它應該是一個空白的白色佈局,而是從「設置」應用中恢復啓動器活動的「快照」。

由於官方文件建議我將AlertDialog換成DialogFragment

public class NicknamePickerDialog extends DialogFragment { 

    public static final String TAG = NicknamePickerDialog.class.getSimpleName(); 

    public interface NicknameDialogListener { 
     void onNicknamePicked(String nickname); 
     void onPickerCanceled(); 
    } 

    private NicknameDialogListener mListener; 
    private EditText mNicknameEditText; 
    private Button mPositiveButton; 

    public void setNicknameDialogListener(NicknameDialogListener listener) { 
     mListener = listener; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     // Set the title 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle(R.string.pick_nickname); 

     // Inflate the custom content 
     View dialogView = getActivity().getLayoutInflater().inflate(R.layout.nickname_dialog_layout, null); 
     builder.setView(dialogView); 

     mNicknameEditText = (EditText) dialogView.findViewById(R.id.nickname); 

     builder.setPositiveButton(R.string.great, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       if (mListener != null) { 
        mListener.onNicknamePicked(mNicknameEditText.getText().toString()); 
       } 
      } 
     }); 

     builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       if (mListener != null) { 
        mListener.onPickerCanceled(); 
       } 
      } 
     }); 

     final AlertDialog dialog = builder.create(); 

     dialog.setOnShowListener(new DialogInterface.OnShowListener() { 
      @Override 
      public void onShow(DialogInterface dialogInterface) { 
       mPositiveButton = dialog.getButton(Dialog.BUTTON_POSITIVE); 
       mPositiveButton.setEnabled(false); 
      } 
     }); 

     mNicknameEditText.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { } 

      @Override 
      public void afterTextChanged(Editable s) { 
       mPositiveButton.setEnabled(s.length() != 0); 
      } 
     }); 

     return dialog; 
    } 
} 

這是Activity代碼

public class ChatActivity extends Activity implements NicknamePickerDialog.NicknameDialogListener { 

    private String mNickname; 
    private TextView mWelcomeTextView; 
    private NicknamePickerDialog mDialog; 

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

     mWelcomeTextView = (TextView) findViewById(R.id.welcome); 
     mDialog = new NicknamePickerDialog(); 
     mDialog.setNicknameDialogListener(this); 
    } 

    private void showNicknamePickerDialog() { 
     mDialog.show(getFragmentManager(), NicknamePickerDialog.TAG); 
    } 

    @Override 
    public void onNicknamePicked(String nickname) { 
     mNickname = nickname; 
     mWelcomeTextView.setText("Welcome " + nickname + "!"); 
    } 

    @Override 
    public void onPickerCanceled() { 
     if (mNickname == null) { 
      finish(); 
     } 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (mNickname == null) { 
      showNicknamePickerDialog(); 
     }; 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mDialog.dismiss(); 
    } 
} 

起初我懷疑這可能是因爲我打電話了DialogFragment的活動的onCreate()回調內部show方法(因爲它可能是太早) ,但推遲到onResume()不能解決問題。在方向更改時也會發生此問題,導致對話框背後的背景變黑。我確信我做錯了什麼,但我真的不知道那是什麼。

回答

0

我真的不明白你想要做什麼。但有一件事你做錯了。

類NicknamePickerDialog

做超越控制方法OnCreateView(),並做如下

// Inflate the custom content 
     View dialogView = getActivity().getLayoutInflater().inflate(R.layout.nickname_dialog_layout, null); 
     builder.setView(dialogView); 

     mNicknameEditText = (EditText) dialogView.findViewById(R.id.nickname); 
    mNicknameEditText.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { } 

      @Override 
      public void afterTextChanged(Editable s) { 
       mPositiveButton.setEnabled(s.length() != 0); 
      } 
     }); 
return dialogView; 

也是你的警告對話框將無法正常工作。在onCreateDialog()中更好地創建按鈕和標題。

dialog.setTitle(R.string.pick_nickname);

希望這會起作用。

+0

我真的盡我所能來解釋這個問題,我真的不認爲你必須不止一次閱讀代碼才能清楚地理解發生了什麼。我正在使用'Fragment'的子類,它專門用於處理對話框,並根據[文檔](http://developer.android.com/guide/topics/ui/dialogs.html#DialogFragment),這是正確的方式來做到這一點。另外,對話本身也有效! –