Как получить данные из универсального диалогового класса - PullRequest
3 голосов
/ 15 августа 2011

Я решил, что хочу создать некоторые пользовательские диалоговые классы, которые в общем случае могли бы использоваться различными Действиями в различных ситуациях. Чтобы быть точным, я создал диалог, который содержит одно поле 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. Я что-то упускаю из виду? Это невозможно?

Ответы [ 2 ]

5 голосов
/ 15 августа 2011

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

Как то так ..

EditText editTextFromDialog = (EditText)dialog.findViewById(the_editText_ID);

Тогда у вас есть обработчик onclick, пока вы находитесь в области действия для объявленного элемента управления (если нет, вам придется изменить область действия в соответствии с вашими потребностями, вы можете просто получить содержимое.

String dialogInput = editTextFromDialog.getText().toString();
0 голосов
/ 31 января 2013

Отлично,

Я внедрил метод onclick в упражнении, и он работает:

public class MainActivity extends FragmentActivity implements OnClickListener {

  protected void button1ActionPerformed() {
        // TODO Auto-generated method stub
        newFragment = new InputDialogFragment().newInstance( R.string.send_trasnsactions, R.string.dialog_fire_missiles, R.string.dialog_fire_missiles );
        newFragment.show(getSupportFragmentManager(), "missiles");

    }

 @Override
    public void onClick( DialogInterface dialog, int whichButton ) {
        Dialog x = (Dialog)dialog;
        EditText editTextFromDialog = (EditText)x.findViewById(2000);
        if ( whichButton == DialogInterface.BUTTON_POSITIVE ) {
            Log.i("x:"+editTextFromDialog.getText().toString(), "Ok");
        }else{
            Log.i("x", "cancel");
        }
    } 

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...