Android:在对话框中更改按钮的文本

时间:2014-09-20 11:56:40

标签: java android button nullpointerexception dialog

我的Android应用程序中有一个Dialog,其中包含一个Button。现在我想更改该Button的文本,但我得到一个NullPointer异常。

按钮打开一个新的Dialog(Datepicker),它为MainActivity提供一个日期(作为一个字符串),然后我将其用于Button。显然我可以声明按钮并定义他,但不能互动。在try-statement中(不确定它是否是一个语句)第一行有效,但如果我没有注释第二行并调用它崩溃(或调用异常,我稍后添加了try部分)。我希望这足够具体。

以下是按钮,MainActivity和按钮所在对话框中的代码:

对话框(.java)

public class CreateDialogFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstance) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater layoutInflater = getActivity().getLayoutInflater();

        builder.setView(layoutInflater.inflate(R.layout.dialog_create, null))
                .setMessage(R.string.create)
                .setPositiveButton(R.string.create, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    }
                })
                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {

                    }
                });

        return builder.create();
    }
}

对话框(.xml)

<?xml version="1.0" encoding = "utf-8"?>
<RelativeLayout
    xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:tools = "http://schemas.android.com/tools"
    android:id = "@+id/dialog_create"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:background="@color/create_bg_1"
    tools:context = ".CreateDialogFragment">

    <EditText
        android:id = "@+id/dialog_create_name"
        android:layout_width = "match_parent"
        android:layout_height = "@dimen/textFieldHight"
        android:text = "@string/create_name"
        android:background="@color/white"
        android:layout_marginTop="4dp"
        android:layout_marginBottom="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp" />

    <Button
        android:layout_width = "wrap_content"
        android:layout_height = "@dimen/textFieldHight"
        android:ems = "6"
        android:text = "@string/date"
        android:background="@color/white"
        android:id = "@+id/create_date_button"
        android:onClick = "pickDate"
        android:layout_below = "@id/dialog_create_name" />

</RelativeLayout>

MainActivity - &gt;导致问题的方法和调用对话框的方法(.java - 部分)

public void openCreate(View view) {
    createDialogFragment = new CreateDialogFragment();
    createDialogFragment.show(fragmentManager, "TEST");
    updateSelectedButton(3);
}

这会导致问题:

public void dateForWhatever(int year, int month, int day) {
    DateFormatter dateFormatter = new DateFormatter();
    String date = dateFormatter.toStringDE(year, month, day);

    try {
        Button createDateButton = (Button) findViewById(R.id.create_date_button);
        createDateButton.setText(date);
    } catch (Exception cannotFindButton) {
        System.out.println("Geh kacken\n" + year + " " + month + " " + day);
    }
}

3 个答案:

答案 0 :(得分:0)

你必须改变

Button createDateButton = (Button) findViewById(R.id.create_date_button);

Button createDateButton = (Button) createDialogFragment.getView().findViewById(R.id.create_date_button);

您的create_date_button位于Dialog的XML中,因此您需要引用该Button

答案 1 :(得分:0)

我找到了一个有效的解决方案。我必须在Dialog(.java)文件的变量中保存Button的引用。然后我做了一个吸气器,可以得到按钮。实际上非常简单,这意味着MainActivity和Dialog必须有两个不同的生命周期。我还添加了这两行来获取Button的参考:

View rootView = layoutInflater.inflate(R.layout.dialog_create, null);
createDateButton = (Button) rootView.findViewById(R.id.create_date_button);

除了工作之外:

builder.setView(rootView).set [...] ;

如果有人遇到同样的问题并且这个说法还不够,请发表评论,我会更详细地填写。

约翰

答案 2 :(得分:-1)

     make constructure in CreateDialogFragment class
     String text1,text2;
     public CreateDialogFragment(String btn1Text,String btn2Text
     {
     text1=btn1Text;
     text2=btn2Text;
     }


     in this code change

      builder.setView(layoutInflater.inflate(R.layout.dialog_create, null))
            .setMessage(R.string.create)
            .setPositiveButton(text1, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialogInterface, int i)
                {

                }
            })
            .setNegativeButton(text2, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialogInterface, int i)
                {

                }
            });