如何在操作栏的自定义对话框中设置自定义按钮单击侦听器?

时间:2014-03-13 15:20:21

标签: android xml

好的,我无法弄清楚这一点.. 这是我想要做的:

我在操作栏中有一个图标 - 当我点击它时会膨胀带有自定义布局文件的对话框。此布局包含EditTextButton。整个过程的目的是编写电子邮件,然后在单击时通过按钮发送。但是当我点击按钮时,我得到一个Nullpoint exception ..

以下是一些代码:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int itemId = item.getItemId();

    switch (itemId) {
        case R.id.action_logout:
            navigateToLogin();
            break;
        case R.id.action_edit_friends:
            Intent intent = new Intent(this, EditFriendsActivity.class);
            startActivity(intent);
            break;
        case R.id.action_message:
            Dialog messageDialog = new Dialog(this);
            messageDialog.setContentView(R.layout.message_bar);
            messageDialog.show();
            Button messageButton = (Button)messageDialog.findViewById(R.id.send_button);
            messageButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    EditText messageText = (EditText) findViewById(R.id.edit_text_message);
                    if (TextUtils.isEmpty(messageText.getText())) {
                        Toast.makeText(MainActivity.this, "Enter a message first!", Toast.LENGTH_SHORT).show();
                    } else {
                        String message = messageText.getText().toString();
                        Intent recipientsIntent = new Intent(MainActivity.this, RecipientsActivity.class);
                        recipientsIntent.putExtra("Text", message);
                        startActivity(recipientsIntent);
                    }
                }
            });
            break;
    }
    return super.onOptionsItemSelected(item);
}

对话框的我的自定义布局文件就是这样:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/structured_relative_interaction"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:gravity="bottom">

        <EditText
            android:id="@+id/edit_text_message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_margin="5dp"
            android:layout_toLeftOf="@+id/send_button"
            android:gravity="bottom"
            android:hint="@string/send_message_hint"
            android:inputType="textCapSentences|textMultiLine"
            android:maxLines="15"
            android:padding="10dp" />

        <Button
            android:id="@+id/send_button"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_alignBottom="@id/edit_text_message"
            android:layout_alignParentRight="true"
            android:background="@drawable/ic_launcher"/>
    </RelativeLayout>
</RelativeLayout>

那么我做错了什么呢?我无法解决这个问题,我已经查看了其他示例并在官方文档中阅读了示例,但是......真糟糕。

2 个答案:

答案 0 :(得分:0)

Dialog也有setContentView(View),因此您可以对视图进行充气并转移到Dialog充气视图。您还可以使用膨胀的视图来查找onClickListener目的所需的视图。我的猜测是视图不是Dialog视图层次结构的一部分,直到它在屏幕上可见。

所以我会说

View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.message_bar, null);
messageDialog.setContentView(view);
View messageButton = view.findViewById(R.id.send_button);
messageButton.setOnClickListener(...);

答案 1 :(得分:0)

使用

EditText messageText = (EditText) messageDialog.findViewById(R.id.edit_text_message);

而不是

EditText messageText = (EditText) findViewById(R.id.edit_text_message);