Android自定义对话框强制关闭问题

时间:2014-03-14 07:49:01

标签: android dialog customdialog

我正在尝试实现一个包含ListView的自定义对话框。目标是在按钮单击时显示对话框。为此,我正在为对话框创建自定义布局,并在按钮单击时设置内容视图。由于某些未知原因,该应用程序正在关闭力量。谁能告诉我我做错了什么?以下是代码段: 主要活动:

package com.example.zdialog;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final String[] myList={"book", "table", "car", "bag", "fridge",
                "television", "radio"};
        Button btn=(Button)findViewById(R.id.button1);
        ListView lv=(ListView)findViewById(R.id.listView1);
        ArrayAdapter<String> aa=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myList);
        lv.setAdapter(aa);

        btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Dialog dialog=new Dialog(MainActivity.this);
                dialog.setContentView(R.layout.dialog_layout);
                dialog.show();

            }
        }); 
    }
}

activity_main.xml中

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="17dp"
        android:text="Show Dialog" />

</RelativeLayout>

dialog_layout.xml:

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

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >

    </ListView>

</RelativeLayout>

如您所见,自定义对话框包含一个简单的ListView。我知道,还有其他方法可以实现基于列表的对话框,但我只是想知道这段代码有什么问题(我自己学习Android编程)。请帮忙!

5 个答案:

答案 0 :(得分:3)

ListView不在R.layout.activity_main内,因此它会为您提供null

您需要更改这些行

    ListView lv=(ListView)findViewById(R.id.listView1);
    ArrayAdapter<String> aa=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, myList);
    lv.setAdapter(aa);

这里它给你NullPointerException ..

所以您可以在onClick()方法内部进行更改..

    Dialog dialog=new Dialog(MainActivity.this);
    dialog.setContentView(R.layout.dialog_layout);
    ListView lv=(ListView)dialog.findViewById(R.id.listView1);
    ArrayAdapter<String> aa=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myList);
    lv.setAdapter(aa);
    dialog.show();

答案 1 :(得分:2)

ListView在Dialog Layout中,但是你试图从Activity布局中获取它,所以改变你的代码以便工作:

    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Dialog dialog=new Dialog(MainActivity.this);
            dialog.setContentView(R.layout.dialog_layout);
             // initialize ListView here

            ListView lv=(ListView)dialog.findViewById(R.id.listView1);
            ArrayAdapter<String> aa=new ArrayAdapter<String>
             (MainActivity.this, android.R.layout.simple_list_item_1, myList);
            lv.setAdapter(aa);

            dialog.show();

        }
    }); 

答案 2 :(得分:1)

正如我从上面的代码中看到的那样,您的ListView位于您设置为自定义对话框背景的dialog_layout.xml内。但您正在错误地访问它,

将按钮单击更改为以下内容,

btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Dialog dialog=new Dialog(MainActivity.this);
                dialog.setContentView(R.layout.dialog_layout);
                ListView lv=(ListView)dialog.findViewById(R.id.listView1);
                ArrayAdapter<String> aa=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myList);
                lv.setAdapter(aa);
                dialog.show();

            }
        }); 

并删除您之前完成的ListView初始化。

答案 3 :(得分:1)

您无法先将数据设置为ListView,然后再打开对话框。在显示ListView之前将数据设置为Dialog,并仅针对Listview的实例访问Dialog

试试如下:

btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Dialog dialog=new Dialog(MainActivity.this);
            dialog.setContentView(R.layout.dialog_layout);
           ListView lv=(ListView)dialog.findViewById(R.id.listView1);
    ArrayAdapter<String> aa=new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, myList);
            lv.setAdapter(aa);
            dialog.show();

        }
    }); 

答案 4 :(得分:1)

您需要更改,因为您的ListView

  ListView lv=(ListView)findViewById(R.id.listView1);

在你的dialog_layout.xml中:所以改变它

  Dialog dialog=new Dialog(MainActivity.this);
  dialog.setContentView(R.layout.dialog_layout);
  ListView lv=(ListView)dialog.findViewById(R.id.listView1);
  ArrayAdapter<String> aa=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myList);
  lv.setAdapter(aa);
  dialog.show();