2013-03-02 183 views
0

好吧,所以我遇到了創建應用程序時的問題(強制關閉),我認爲它與我實現佈局的方式有關。所以有幾個問題:首先,我有一個相對佈局,其中包括一個帶有按鈕旁邊的文本輸入,一個列表視圖(仍在相對佈局中)和另一個按鈕。這是我的主要XML文件:佈局中的Android視圖

<?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個按鈕出現,主題從全息改爲全息光。所以我想知道這是否可行,我只看到列表視圖完全匹配父佈局的例子。

我的第二個問題是,如何處理使用輸入來向列表視圖添加值,我可以在主要活動類中執行該操作,還是可以有另一個類來處理列表視圖並仍然引用主佈局。

這是我的主類:

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); 

} 


} 

希望這是有道理的,感謝您的任何幫助。

+0

你可以發佈一個強制關閉的日誌貓嗎? – 2013-03-02 22:27:20

回答

1

問題是要調用此線

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

通過的setContentView設定內容鑑於onCreate()方法()之前,所以你得到的NullPointerException。不要忘記,在調用findViewById之前,你必須設置內容視圖。因此,刪除上面的行,因爲你正在onCreate方法中創建函數範圍listView,你的NullPointerException問題將被解決。同時也改變addString方法的第一行這樣

choicesArray = choices.toArray(choicesArray); 
+0

我甚至沒意識到我有兩次這樣的陳述。謝謝! – 2013-03-03 00:23:22

1
  1. 將您的ArrayAdapter定義爲您類的成員(而不是作爲onCreate()中的變量 )。
  2. 將適配器設置爲onCreate()中的listView。
  3. 爲您的按鈕設置onClickListener。
  4. 單擊 按鈕時,將EditText中的文本添加到適配器。
  5. 利潤!