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からHololightに変更されました。したがって、これが機能するかどうか疑問に思っています。リストビューが親レイアウトと完全に一致する例しか見たことがありません。

2番目の質問は、入力を使用してリストビューに値を追加する方法、メインアクティビティクラスでそれを行う方法、またはリストビューを処理し、メインレイアウトを参照する別のクラスを使用する方法です。

これは私のメインクラスです:

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 に答える