我正在尝试实现一个包含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编程)。请帮忙!
答案 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();