Я решил, что хочу создать некоторые пользовательские диалоговые классы, которые в общем случае могли бы использоваться различными Действиями в различных ситуациях. Чтобы быть точным, я создал диалог, который содержит одно поле EditText и заголовок, подобный этому:
public class EditTextDialogFragment extends DialogFragment {
// Factory method to create a new EditTextDialogFragment
public static EditTextDialogFragment newInstance( int title, int defaultText ) {
EditTextDialogFragment frag = new EditTextDialogFragment( );
Bundle args = new Bundle( );
args.putInt( "title", title );
args.putInt( "defaultText", defaultText );
frag.setArguments( args );
return frag;
}
// Set title and default text
@Override
public Dialog onCreateDialog( Bundle savedInstanceState ) {
// Set an EditText view to get user input
EditText inputView = new EditText( getActivity( ) );
inputView.setHint( getArguments( ).getInt( "defaultText" ) );
AlertDialog.Builder builder = new AlertDialog.Builder( getActivity( ) )
.setIcon( android.R.drawable.ic_dialog_alert )
.setTitle( getArguments( ).getInt( "title" ) )
.setPositiveButton( R.string.ok, ( DialogInterface.OnClickListener )getActivity( ) )
.setNegativeButton( R.string.cancel, ( DialogInterface.OnClickListener )getActivity( ) )
.setView( inputView );
return builder.create( );
}
}
Обратите внимание, что я делаю это, используя DialogFragments, как это было предложено в последнем Android SDK.
В любом случае, идея заключается в том, что из любого занятия я могу сделать такой звонок:
EditTextDialogFragment etdf = EditTextDialogFragment.newInstance( R.string.add_new_term, R.string.term_name );
etdf.show( getSupportFragmentManager( ), "new_term" );
И пока я реализую DialogInterface.OnClickListener в Activity, я получу обратный вызов, когда пользователь завершит диалог. Итак, у меня есть этот метод в моей деятельности:
@Override
public void onClick( DialogInterface dialog, int whichButton ) {
if ( whichButton == DialogInterface.BUTTON_POSITIVE ) {
Toast.makeText( getApplicationContext( ), "Dialog finished!", Toast.LENGTH_SHORT ).show( );
}
}
Я использовал точно такой же дизайн для диалога Да / Нет, и он отлично работал, и мне это нравится. Я могу легко вызвать его из любого действия с помощью всего двух строк кода и показать диалог «Да / Нет» с настраиваемым заголовком. Затем обратный вызов onClick содержит информацию о том, какая кнопка была нажата, поэтому в диалоговом окне отображается вся необходимая информация.
Однако для этого диалога EditText я не могу понять, как получить данные из поля EditText внутри метода OnClick. Единственное, что передается назад, - это нажатие кнопки и ссылка DialogInterface (что, насколько я могу судить, не помогает мне получить данные EditText).
Единственные решения, которые я видел, включают в себя встраивание кода OnClickListener в код компоновщика следующим образом:
builder.setItems(terms, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText( getApplicationContext( ), inputView.getText().toString(), Toast.LENGTH_SHORT ).show( );
}
});
но это противоречит цели создания общего диалогового класса, который можно использовать из любого действия, для которого требуется EditBox. Я что-то упускаю из виду? Это невозможно?