Android:在对话框中找到一个按钮

时间:2014-09-20 17:36:13

标签: java android nullpointerexception dialog null

我有一个对话,由我的MainActivity调用。在这个Dialog里面有一个自定义按钮。当我尝试使用

在我的MainActivity中获取该按钮时
Button createDateButton = (Button) findViewById(R.id.create_date_button);

始终为空(因此我稍后会收到Nullpointer异常)。我认为这与对话框内的按钮有关...

Dialog扩展了DialogFragment。它在运行时在MainActivity内部调用,作为对另一个Button的反应。如果您需要更多信息,请告诉我

以下是一些代码:

MainActivity(部分原因,因为它有200多行)

public class MainActivity extends Activity implements UseDateInParentActivityInterface
{
    FragmentManager fragmentManager = getFragmentManager();

    CreateDialogFragment createDialogFragment;
    DialogFragment datePicker;


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        homeFragment = new HomeFragment();

        fragmentManager.beginTransaction().add(R.id.mainFrame, homeFragment).commit();
        findViewById(R.id.bottomButton_home).setBackgroundResource(R.drawable.ic_home);
    }

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

        updateSelectedButton(3);
    }


    public void pickDate(View v)
    {
        datePicker = new DatePickerFragment();
        datePicker.show(getFragmentManager(), String.format(getResources().getString(R.string.pickDate)));
    }

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

        Button createDateButton = (Button) findViewById(R.id.create_date_button);
        if (createDateButton != null)
        {
            createDateButton.setText(date);
        }
        else
        {
            System.out.println("bloeder Button ist gleich null");
        }
    }
}

这是DialogFragment Java Class

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();
    }
}

Dialog xml.File

<?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"
    >

    <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>

约翰

2 个答案:

答案 0 :(得分:1)

CreateDialogFragment中,修改您的onCreateDialog()

@Override
public Dialog onCreateDialog(Bundle savedInstance)
{
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    LayoutInflater layoutInflater = getActivity().getLayoutInflater();
    View root = layoutInflater.inflate(R.layout.dialog_create, null);

    builder.setView(root).setMessage(R.string.create);
    // ...

    Button createDateBtn = (Button) root.findViewById(R.id.create_date_button);
    // set click listener here ...

    return builder.create();
 }

问题是该按钮位于Dialog的视图层次结构中,而不是Activity。如果你从你的Activity中调用findViewById(),你将总是确实为null:层次结构存在于两个不同的窗口中。

此代码段获取对话框中按钮的句柄。它会从对话框(而非活动)的根视图调用findViewById() 并检索按钮。然后,您可以将其保存到引用以供以后使用,或者直接在那里设置单击侦听器。在这个监听器中,您可以编写自己的逻辑,例如调用您的活动方法。

答案 1 :(得分:0)

试试这个: 按钮createDateButton =(Button)rootView.findViewById(R.id.create_date_button);

这应该有效。