如何在Android中的AlertDialog中设置Edittext

时间:2015-09-01 12:38:08

标签: android dialog android-alertdialog

我有一个启动Google的SpeechToText对话框的ImageButton。 此外,我正在为我的对话框使用自定义布局。

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp">

        <RelativeLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >

            <EditText
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:inputType="textMultiLine"
                android:ems="10"
                android:id="@+id/dialog_edittext"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:paddingRight="34dp" />

            <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/dialog_imagebutton"
                android:src="@drawable/ic_sirioriginalstate_teaser"
                android:background="@null"
                android:layout_alignRight="@+id/dialog_edittext"
                android:scaleType="fitEnd"
                android:paddingRight="5dp" />
        </RelativeLayout>

    </LinearLayout>
</RelativeLayout>

正如您所见,我有ImagebuttonEdittext,我必须在其中设置文字。

                LayoutInflater li = LayoutInflater.from(context);
                View view = li.inflate(R.layout.dialog, null);
                final EditText text = (EditText) view.findViewById(R.id.dialog_edittext);

                final ImageButton imageButton = (ImageButton) view.findViewById(R.id.dialog_imagebutton);
                imageButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        promtSpeechInput();
                    }
                });

                AlertDialog.Builder builder = new AlertDialog.Builder(context);
                builder.setView(view);
                AlertDialog alertDialog = builder.create();
                alertDialog.show();
                return true;

promptSpeechInput方法启动语音对话框。

    private void promtSpeechInput() {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
    intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS, 6000);
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
            "Aufnahme...");

    try {
        startActivityForResult(intent, SPEECH_TO_TEXT_REQUEST);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(getApplicationContext(), "Test01", Toast.LENGTH_SHORT).show();
    }
}

如果说出某些内容,将调用onActivityResult方法。 还有我的问题。

如何将说出的单词设置为对话框Edittext

我之前使用的是相同的,但这次没用。

if (resultCode == RESULT_OK && null != data) {
                ArrayList<String> result = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                textField.setText(textField.getText() + " " + result.get(0));
            }
            break;

我尝试自己做一些事情,但这不起作用:

if (resultCode == RESULT_OK && null != data) {
            ArrayList<String> result = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            LayoutInflater li = LayoutInflater.from(context);
            View view = li.inflate(R.layout.dialog, null);

            final EditText text = (EditText) view.findViewById(R.id.dialog_edittext);
            text.setText(text.getText().toString() + " " + result.get(0));
        }

1 个答案:

答案 0 :(得分:1)

因此,您需要将被调用活动的结果转发给对话框。由于它是接收结果的调用活动,因此调用活动必须将结果传递给对话框。通常这是通过听众完成的。调用活动将具有某种类型的成员,如

interface MyActivityListener {
    void onMyActivityResult(String s);
};
MyActivityListener currentListener;

理想情况下,您的对话框将自行实现此接口或具有成员

// inside the dialog class
MyActivityListener mListener = new MyActivityListener() {
    void onMyActivityResult(String s) {
        ...
    }
}

但是您无法在对话框中添加字段,因为您使用的是Builder。但是你可以将对话框包装在一个类中。

// in CallingActivity:
interface MyActivityListener {
    void onMyActivityResult(String s);
};
MyActivityListener currentListener;

void onActivityResult(...) {
        if (currentListener != null) {
              currentListener.onMyActivityResult(....);
        }
    }
}

class DialogWrapper { // contains members that the dialog cannot contain (because the builder always returns an AlertDialog)
    View rootView;
    MyActivityListener mListener = new MyActivityListener() {
       void onMyActivityResult(String s) {
           ((EditText)rootView.findViewById(R.id.myeditor)).setText(s);
           ...
       }
    }

    void showDialog() {
            AlertDialog.Builder builder = ...;
            ... li = ...;
            rootView = li.inflate(...);
            builder.setView(rootView);
            builder.setOnDismissListener(
               new ... { currentListener = null; }  // !!!!!
            );
            AlertDialog alertDialog = builder.create();
            currentListener = mListener;   // !!!!!
            alertDialog.show();
    }
}

// how to use:
void someMethod() {
    new DialogWrapper.showDialog();
}

或者,或者,您可以决定尽管所有这些侦听器都非常犹太,但这一切都归结为具有指向根视图的指针的活动。因此,如果您的活动非常小,您只需声明

即可
// in CallingActivity
View pointerToCurrentDialogRootView;

并在对话框的OnDismissListener中将其设置为null。

这是一个很好的解决方案吗?好吧,OOP是责任分配,活动不应该对对话框的EditText做任何事情负责。 OTOH,它已经发生了接收对话框要求的结果的活动。我的建议是:将所有活动对话的内容放在内部类中。也许,扩展DialogWrapper(上面)来做与对话相关的所有事情,即使你决定删除监听器的东西。