8

我无法让 AlertDialog 将文本传递回调用它的活动。似乎问题是调用 findViewByID 时找不到正确的 EditText,但我是 Android 新手,不知道为什么会这样。

代码如下:

public class ModifyDialogFragment extends DialogFragment {

/* The activity that creates an instance of this dialog fragment must
 * implement this interface in order to receive event callbacks.
 * Each method passes the DialogFragment in case the host needs to query it. */
public interface MDialogListener {
    public void onMDialogPositiveClick(String newValue);
}

// Use this instance of the interface to deliver action events
MDialogListener mListener;

String mEntryName = "";
EditText mEditText;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    LayoutInflater inflater = getActivity().getLayoutInflater();

    final View modifyView = inflater.inflate(R.layout.modify_dialog, null);

    builder.setView(modifyView);

    final EditText editText = (EditText) getActivity().findViewById(R.id.modificationText);



           builder.setPositiveButton(R.string.modify, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   mListener.onMDialogPositiveClick(editText.getText().toString());
               }
           });
           builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   // User cancelled the dialog
               }
           });

    // Create the AlertDialog object and return it
    return builder.create();
}

// Override the Fragment.onAttach() method to instantiate the ModifyDeleteDialogListener
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // Verify that the host activity implements the callback interface
    try {
        // Instantiate the MDDialogListener so we can send events to the host
        mListener = (MDialogListener) activity;
    } catch (ClassCastException e) {
        // The activity doesn't implement the interface, throw exception
        throw new ClassCastException(activity.toString()
                + " must implement MDialogListener");
    }
}

以及对应的 modify_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/modificationText"
    android:inputType="text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:layout_marginLeft="4dp"
    android:layout_marginRight="4dp"
    android:layout_marginBottom="4dp"/>

为什么找不到editText?我可以做些什么来使这项工作按预期工作,将新字符串传递回活动?

4

4 回答 4

10

改变

final EditText editText = (EditText) getActivity().findViewById(R.id.modificationText);

final EditText editText = (EditText) modifyView.findViewById(R.id.modificationText);

你的EditText生活,modify_dialog.xml所以你需要使用被夸大的变量layout(这里modifyView)来找到将要查找的id不是。layoutgetActivty()

于 2013-09-18T16:51:16.187 回答
2

你膨胀一个布局,你有这个builder.setView(modifyView);

所以要初始化edittext替换

 final EditText editText = (EditText)getActivity().findViewById(R.id.modificationText);

经过

 final EditText editText = (EditText) modifyViewfindViewById(R.id.modificationText);

findViewById查找具有在当前膨胀布局中提供的 id 的视图。您不需要getActivity使用膨胀的视图对象来初始化您的 EditText。

public final Activity getActivity ()

Added in API level 11
Return the Activity this fragment is currently associated with.
于 2013-09-18T16:55:26.103 回答
1

那是因为您正在从活动中搜索视图尝试使用 modifyView.findView...</p>

于 2013-09-18T16:51:32.963 回答
0

只是这个

EditText editText = (EditText) modifyView.findViewById(R.id.modificationText);

出了什么问题?

在活动中,你只是findViewById任何你想要的视图,它指的是活动布局。但在dialogdialogFragments或自定义视图中,您必须手动引用当前布局,例如

view.findViewById(...)

由于您的代码指的是其父活动,因此应用程序试图在活动中查找 id,但实际上您的 id 属于您的自定义视图modifyView

因此,这是您的代码找到该 ID 的正确方法。

于 2017-10-27T21:08:54.877 回答