android - 如何访问或创建对 DialogFragment 中小部件的引用

标签 android android-fragments android-dialogfragment

我创建了一个从 DialogFragment 扩展的类。我使用了自定义布局,并向该对话框添加了一些按钮。

我为按钮定义了字段,但是当我从主 Activity 启动对话框时,我得到 nullreferenceexception。

这是对话框类:

公共(public)类 PickRewardDialog 扩展 DialogFragment{

private Button mButtonAddCoin;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mButtonAddCoin = (Button) getDialog().findViewById(R.id.button_dialog_reward_get_coin);
    mButtonAddCoin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getDialog().getContext().getApplicationContext(), "You will" +
                    " receive 5 coins!", Toast.LENGTH_SHORT).show();
        }
    });
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if(getDialog() != null){
        getDialog().setCanceledOnTouchOutside(false);
    }
    return super.onCreateView(inflater, container, savedInstanceState);
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    Resources res = getActivity().getResources();
    Bundle bundle = getArguments();

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    builder.setView(inflater.inflate(R.layout.dialog_pick_reward, null))
    //Positive button
    .setPositiveButton(R.string.dialog_choose_reward_positive_button,
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    //do nothing or Dismiss()
                }
            }
    );

    return builder.create();
}

}

和布局:

<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#FFFFBB33"
    android:contentDescription="@string/app_name"
    android:scaleType="center"
    android:src="@drawable/dialog_title_pick_your_reward"/>

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Add 5 coins to your account!"
    android:id="@+id/button_dialog_reward_get_coin"
    android:layout_gravity="center_horizontal"/>

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Get a temorary boost on leaderboard!"
    android:id="@+id/button_doalog_reward_boost"/>

所以问题是如何设置 ClickListener 并用它做一些事情?

最佳答案

该对话框在 FragmentonCreate() 回调中不可用,因此 mButtonAddCoin 引用将为 null。相反,在 onCreateDialog() 回调中设置 Button,您实际上会在其中扩展对话框的 View :

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Resources res = getActivity().getResources();
    Bundle bundle = getArguments();
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View dialogView = inflater.inflate(R.layout.dialog_pick_reward, null);
    mButtonAddCoin = (Button) dialogView.findViewById(R.id.button_dialog_reward_get_coin);
    mButtonAddCoin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getDialog().getContext().getApplicationContext(), "You will" +
                    " receive 5 coins!", Toast.LENGTH_SHORT).show();
        }
    });

    builder.setView(dialogView);
    //Positive button
    .setPositiveButton(R.string.dialog_choose_reward_positive_button,
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    //do nothing or Dismiss()
                }
            }
    );

    return builder.create();
}

关于android - 如何访问或创建对 DialogFragment 中小部件的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23384306/

相关文章:

android - 自定义 fragment 的偏好

android - 如何防止 BottomSheetDialogFragment 在导航到另一个 fragment 后关闭?

android - 将 tess-two(Tesseract Tools for Android)库集成到 Android 工作室并构建 ndk

安卓图库组件

android - DialogFragment 导致 IllegalStateException

android - java.lang.IllegalArgumentException : No view found for 异常

android - 如何选择回收站 View 中的项目并将项目位置获取到我的 Activity

java - "Condition is always ' 真 '"和 "Array index is out of bounds"警告

android - 如何将自定义按钮添加到气球 android-mapviewbaloons 中?

android - SoftKeyboard 不会为新显示的 Fragment 显示