Использование данных намерений и закончить в Android - PullRequest
0 голосов
/ 19 июля 2011

Я создаю приложение таким образом, что пользователь находится в Activity и открывает AlertDialog.

Внутри alertDialog есть кнопка, которая открывает второе действие, ожидает результат и заполняет текстовое поле.в alertDialog.

Ну, по крайней мере, он должен.

Вот фрагмент, чтобы лучше проиллюстрировать проблему:

private String mFillAddrField = "";
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if(data == null) {
            ...
        } else {
            Bundle b = data.getExtras(); //DATA retrieved from second activity successfully
            mFillAddrField = b.getString("address");
        }
    }
}

...
public void displayAddScreen() {
    AlertDialog.Builder alert = new AlertDialog.Builder(this);

    alert.setTitle("Create a new Grocery Store");
    alert.setMessage("Create a new store by filling out the form below.");

    LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.newstore_dialog, (ViewGroup) findViewById(R.id.nsd_root));

    final EditText nameField = (EditText) layout.findViewById(R.id.nsd_et_name);
    final EditText addrField = (EditText) layout.findViewById(R.id.nsd_et_address);
    final Button addrSelect = (Button) layout.findViewById(R.id.nsd_b_address);

    alert.setView(layout);

    addrSelect.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            //Open MAPS API return me an address
            //Save address to text field
            Intent i = new Intent(getApplicationContext(), GroceryMapActivity.class);
            startActivityForResult(i,0);
            addrField.setText(mFillAddrField); //OFFENDING CODE HERE
        }
    });

Моя проблема в том, что вызовaddrField.setText приходит до того, как действие будет завершено (возможно, до его начала!), как я могу ждать здесь, пока действие не вернет результат, а затем продолжить оставшуюся часть кода (задание текста)?

Ответы [ 2 ]

2 голосов
/ 19 июля 2011

Переместите addrField.setText () в свой метод onActivityResult ()

(Вы не можете останавливаться и ждать в потоке пользовательского интерфейса так, как вам этого хочется)

Я изменил предоставленный код, чтобы сделать addrField членом класса и переместить его, чтобы он соответствовал тому, что вы хотите сделать:

private String mFillAddrField = "";
EditText addrField;
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if(data == null) {
            ...
        } else {
            Bundle b = data.getExtras(); //DATA retrieved from second activity successfully
            mFillAddrField = b.getString("address");
            addrField.setText(mFillAddrField);
        }
    }
}

...
public void displayAddScreen() {
AlertDialog.Builder alert = new AlertDialog.Builder(this);

alert.setTitle("Create a new Grocery Store");
alert.setMessage("Create a new store by filling out the form below.");

LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.newstore_dialog, (ViewGroup) findViewById(R.id.nsd_root));

final EditText nameField = (EditText) layout.findViewById(R.id.nsd_et_name);
addrField = (EditText) layout.findViewById(R.id.nsd_et_address);

final Button addrSelect = (Button) layout.findViewById(R.id.nsd_b_address);

alert.setView(layout);

addrSelect.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        //Open MAPS API return me an address
        //Save address to text field
        Intent i = new Intent(getApplicationContext(), GroceryMapActivity.class);
        startActivityForResult(i,0);
    }
});
1 голос
/ 19 июля 2011

Когда вы создаете AlertDialog, вызывайте addrField.setText(mFillAddrField) сразу после его инициализации.При первом создании диалогового окна addrField будет пустым.Когда onActivityResult() завершится, адрес будет в mFillAddrField, а когда вы перестроите диалоговое окно, вы сможете установить addrField в адрес.

...