我的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);
}
}
答案 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)
{
}
});