0

好的,所以我在创建应用程序(强制关闭)时遇到了问题,我认为这与我实现布局的方式有关。所以有几个问题:首先,我有一个相对布局,其中包括一个文本输入,旁边有一个按钮,一个列表视图(仍在相对布局内)和下面的另一个按钮。这是我的主要 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/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<EditText
    android:id="@+id/edit_choice"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/Button1"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_toLeftOf="@+id/Button1"
    android:hint="@string/edit_choice" />

<Button
    android:id="@+id/Button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:onClick="addString"
    android:text="@string/button_add" />

<Button
    android:id="@+id/Button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="22dp"
    android:text="@string/button_random" />


<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/Button2"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/Button1"
    tools:listitem="@android:layout/simple_list_item_1" >
</ListView>

</RelativeLayout>

在我尝试运行此程序时,我什至更改了 .java 文件中的任何内容之前,只出现了文本输入和 2 个按钮,并且主题从 Holo 更改为 Holo light。所以我想知道这是否可行,我只看到列表视图完全匹配父布局的示例。

我的第二个问题是如何处理使用输入向列表视图添加值,我可以在主活动类中执行此操作,还是可以让另一个类来处理列表视图并仍然引用主布局。

这是我的主要课程:

public class MainActivity extends Activity 
{

public ArrayList <String> choices = new ArrayList <String>();
public ListView listView = (ListView) findViewById(R.id.listView1);
public String [] choicesArray;


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

    ListView listView = (ListView) findViewById(R.id.listView1);
    choicesArray = new String [] {"You have not entered a choice yet"};
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, android.R.id.text1, choicesArray);
    listView.setAdapter(adapter);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) 
{
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

//adds the string to the list
public void addString(View view) 
{

    choicesArray = (String[]) choices.toArray();
    EditText editText = (EditText) findViewById(R.id.edit_choice);
    String message = editText.getText().toString();
    choices.add(message);

}


}

希望这是有道理的,并感谢您的帮助。

4

2 回答 2

1
  1. 将 ArrayAdapter 定义为类的成员(而不是 onCreate() 中的变量)。
  2. 在 onCreate() 中将适配器设置为您的 listView。
  3. 为您的按钮设置 onClickListener。
  4. 单击按钮时,将 EditText 中的文本添加到适配器。
  5. 利润!
于 2013-03-02T22:46:18.110 回答
1

问题是你打电话给这条线

public ListView listView = (ListView) findViewById(R.id.listView1);

在通过 onCreate() 中的 setContentView() 方法设置内容视图之前,您将获得 NullPointerException。不要忘记在调用 findViewById 之前您必须设置内容视图。所以删除上面的行,因为您在 onCreate 方法中创建函数范围 listView 并且您的 NullPointerException 问题将得到解决。并且还像这样更改 addString 方法的第一行

choicesArray = choices.toArray(choicesArray);
于 2013-03-02T22:51:18.293 回答