3

我想一個AlertDialog用一個EditText字段中它接受輸入。這本身非常簡單。但是,我希望有一些「明顯」的功能可以作爲此請求的後果。我會一一接受他們。我正在尋找任何能夠解決這些問題的人。我猜測解決方案是,「寫你自己的定製對話你懶惰的屁股。」一個AlertDialog更好的解決方案有一個EditText

AlertDialogEditText

final EditText input = new EditText(context); 
final AlertDialog dlg = new AlertDialog.Builder(this). 
    setTitle("Title"). 
    setView(input). 
    setCancelable(false). 
    setPositiveButton(android.R.string.ok, new OnClickListener() 
    { 
     @Override 
     public void onClick(final DialogInterface dialog, final int which) 
     { 
      /* Handle ok clicked */ 
      dialog.dismiss(); 
     } 
    }). 
    setNegativeButton(android.R.string.cancel, new OnClickListener() 
    { 
     @Override 
     public void onClick(final DialogInterface dialog, final int which) 
     { 
      /* Handle cancel clicked */ 
      dialog.dismiss(); 
     } 
    }).create(); 
dlg.show(); 

耶,偉大工程。如果輸入字段馬上聚焦(並顯示鍵盤),那肯定會很好,對吧?

AlertDialog與集中EditText 下面的代碼將是create()後和前dlg.show()

/** This requires API Level 8 or greater. */ 
dlg.setOnShowListener(new OnShowListener() 
{ 
    @Override 
    public void onShow(final DialogInterface dialog) 
    { 
     input.requestFocus(); 
     ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(input, 0); 
    } 
}); 

幹得好......我猜。現在,我有這樣的集中輸入它會是不錯的,如果它推崇的輸入IME選項...

AlertDialog與自定義IME選項

input.setImeOptions(EditorInfo.IME_ACTION_DONE); 
input.setOnEditorActionListener(new OnEditorActionListener() 
{ 
    @Override 
    public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event) 
    { 
     /** Same code here that goes in the dialog.setPositiveButton OnClickListener */ 
     dlg.dismiss(); 
     return true; 
    } 
}); 

集中EditText現在,這真的不是一個偉大的溶液(重碼),但它的工作原理...

人究竟有沒有解決這個問題的一個更好的辦法,或者是不是真的那麼稀有詢問用戶的一小片的信息在一個對話框,還是我只是一個更好的人,應該去寫我自己的對話?

+0

爲什麼不把所有的重複的代碼到像'setUpImeDialog(AlertDialog DLG,EditText上輸入){...}'的方法? – Eric

+0

@Eric顯然你會。仍然不太理想,你必須聽完成(或其他)IME事件和點擊確定請求。 – xbakesx

+0

是的,但您可以讓IME事件觸發點擊。像這樣:'dlg.getButton(DialogInterface.BUTTON_POSITIVE).performClick();'。這仍然是次要事件,但它避免了重複的代碼。 (如果這是你在找什麼,我可以將其添加爲一個答案。) – Eric

回答

5

按在OP評論:

您不必在OnEditorActionListener有這樣重複的代碼。激活時,您可以告訴操作系統單擊「確定」按鈕,而不是重複該代碼。

事情是這樣的:

public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event) { 
    dlg.getButton(DialogInterface.BUTTON_POSITIVE).performClick(); // Click OK button 
    return true; 
} 

總的來說,我會說,你是採取正確的方法(documentation about collecting information through dialogs)。正如我在評論所提到的,OS使用一個AlertDialog瓦特/ EditText用於添加字典字(到用戶詞典),所以這是在OS的預期功能。

2

您可以隨時使用Theme.Dialog主題或DialogFragment切換到Activity,這可讓您在調整小部件時有更大的自由度。 AlertDialogs可能更適合顯示信息。希望這可以幫助。

+0

其實我不同意。 [文檔](http://developer.android.com/guide/topics/ui/dialogs.html)顯示了收集信息而不是顯示它的方法。另外,在OS中插入一個示例:添加字典單詞。 – Eric

+0

@Egor我認爲在任何人去之前創建一個新的活動,他們應該考慮創建一個自己的佈局的對話框,並做他們想要的方式。 – xbakesx

相關問題