簡體   English   中英

如果我嘗試進行特定活動,則應用程序崩潰

[英]App crashes if I try going to a specific activity

所以我正在做一個簡單的應用程序。 基本上,它只是通過最后的自定義列表視圖來制作獲勝列表。

它從主屏幕上開始,那里有兩個按鈕,一個是“添加”按鈕,可將您帶到“添加”活動。 如果按下此按鈕,將帶您到一個頁面,在其中鍵入葡萄酒的名稱,價格,描述,然后在列表中單擊“提交”按鈕。 主屏幕上的另一個按鈕是“轉到列表”按鈕,它直接將您帶到列表活動。

如果我單擊“添加”按鈕,添加一種葡萄酒,然后轉到列表,則效果很好。 我可以看到清單。 如果我不添加任何內容,它甚至可以工作。 我可以看到空列表活動。

但是,當我按下主屏幕上的“轉到列表”按鈕時,它崩潰並顯示“應用程序已停止”。

我不明白為什么我可以通過“添加”按鈕進入列表,但是此按鈕根本不起作用。

我可以幫忙嗎?

這是三個相關的活動,AddActivity,ListActivity和MainActivity。

AddActivity:

public class AddActivity extends AppCompatActivity {


EditText editWineName;
EditText editWinePrice;
EditText editWineDescription;
Button btnSubmit;
Button btnGoToList;
String stringWineName;
String stringWinePrice;
String stringWineDescription;
ArrayList<String> listWineName = new ArrayList<>();
ArrayList<String> listPrice = new ArrayList<>();
ArrayList<String> listWineDescription = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add);
    setVariables();



    btnSubmit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setVariables();
            listWineName.add(stringWineName);
            listPrice.add(stringWinePrice);
            listWineDescription.add(stringWineDescription);
            Toast.makeText(AddActivity.this, stringWineName + " was added to the list.", Toast.LENGTH_SHORT).show();
            clearEditText();

        }
    });

    btnGoToList.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intentGoToList = new Intent(AddActivity.this,ListActivity.class);
            intentGoToList.putStringArrayListExtra("WINENAME", listWineName);
            intentGoToList.putStringArrayListExtra("WINEPRICE", listPrice);
            intentGoToList.putStringArrayListExtra("WINEDESCRIPTION", listWineDescription);
            startActivity(intentGoToList);
        }
    });

}

private void setVariables(){
    editWineName = (EditText) findViewById(R.id.editName);
    editWinePrice = (EditText) findViewById(R.id.editPrice);
    editWineDescription = (EditText) findViewById(R.id.editDescription);
    btnSubmit = (Button) findViewById(R.id.btnSubmit);
    btnGoToList = (Button) findViewById(R.id.btnGoToList);
    stringWineName = editWineName.getText().toString();
    stringWinePrice = "$" + editWinePrice.getText().toString();
    stringWineDescription = editWineDescription.getText().toString();
}

private void clearEditText() {
    editWineName.getText().clear();
    editWinePrice.getText().clear();
    editWineDescription.getText().clear();
}
}

ListActivity:

public class ListActivity extends AppCompatActivity {

ListView wineList;
ArrayAdapter adapter;
Button btnBacktoMain;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);
    setVariables();



    ArrayList<String> listWineName = getIntent().getStringArrayListExtra("WINENAME");
    ArrayList<String > listWinePrice = getIntent().getStringArrayListExtra("WINEPRICE");
    ArrayList<String> listWineDescription = getIntent().getStringArrayListExtra("WINEDESCRIPTION");

    adapter = new CustomAdapter(this, listWineName, listWinePrice, listWineDescription);
    wineList.setAdapter(adapter);


    btnBacktoMain.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intentBackToMain = new Intent(ListActivity.this,MainActivity.class);
            startActivity(intentBackToMain);
        }
    });

}

private void setVariables (){
    btnBacktoMain = (Button) findViewById(R.id.btnBackToMain);
    wineList = (ListView) findViewById(R.id.listWine);

}

}

主要活動:

public class MainActivity extends AppCompatActivity {

Button btnAdd;
Button btnList;

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

    btnAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {                                                //Goes to the add activity
            Intent intentAdd = new Intent(MainActivity.this, AddActivity.class);
            startActivity(intentAdd);
        }
    });

    btnList.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {                                              //Goes to the list activity
            Intent intentList = new Intent(MainActivity.this, ListActivity.class);
            startActivity(intentList);
        }
    });
}

private void setVariables(){
    btnAdd = (Button) findViewById(R.id.btnAddWine);
    btnList = (Button) findViewById(R.id.btnViewList);
}

}

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
    at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:344)
    at android.widget.ListView.setAdapter(ListView.java:493)
    at com.example.jeremy.mywine.ListActivity.onCreate(ListActivity.java:33)

您的崩潰表明在ListActivity中提供給ListView的適配器中的數據為空。 使其不為空。 從第33行的ListActivity.java開始,然后向后查找您正在(或在這種情況下不是)初始化列表適配器中的數據的位置。

在這種情況下,您期望有意圖的數據。 好,您的意圖在哪里設置? 在您的MainActivity中,單擊。 好的,您只啟動了活動而沒有在意向附加中傳遞任何數據,因此ListActivity的意向沒有任何可撤出的ListActivity ,因此會導致崩潰。

因此,您需要在MainActivity初始化數據並將其設置為用於啟動ListActivity的Intent中的額外數據。

由於ListActivity期望這樣:

ArrayList<String> listWineName = getIntent().getStringArrayListExtra("WINENAME");
ArrayList<String > listWinePrice = getIntent().getStringArrayListExtra("WINEPRICE");
ArrayList<String> listWineDescription = getIntent().getStringArrayListExtra("WINEDESCRIPTION");

您將更新MainActivity以執行類似的操作(其中getDescriptions()是一種創建返回字符串列表的虛構方法)

btnList.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //Goes to the list activity
        Intent intentList = new Intent(MainActivity.this, ListActivity.class);
        intentList.putExtra("WINENAME", new ArrayList<String>());     // Empty list
        intentList.putExtra("WINEPRICE", Arrays.asList("Foo", "Bar")); // Explicit list named items
        intentList.putExtra("WINEDESCRIPTION", getDescriptions());    // Get list from private method
        startActivity(intentList);
    }
});

還要檢查這篇文章對學習如何閱讀和理解崩潰日志很有用。

查看有關如何開始活動的文檔

希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM