簡體   English   中英

如何修復我的 Android 應用程序在啟動時一直崩潰,無法打開的錯誤? (更多細節見描述)

[英]How to fix a bug where my Android app keeps crashing on start, does not open? (see description for more details)

這是完整的 logcat 信息:

引起:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference at cmput301.subbook.MainActivity.onCreate(MainActivity.java:49) ) 在 android.app.Activity.performCreate(Activity.java:6999) 在 android.app.Activity.performCreate(Activity.java:6990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) 在 android.app .ActivityThread.performLaunchActivity(ActivityThread.java:2731) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H。 handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java) :6494) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Runti meInit.java:438) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

這些是相關文件:

活動_main.xml :

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="cmput301.subbook.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Exit App"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ListView
        android:id="@+id/listView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mainText"
        android:background="#e6a1a1"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="0dp" />

    <!-- <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"

        android:layout_marginEnd="144dp"
        android:layout_marginTop="504dp"
        android:text="Add New Subscription"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0" /> -->


</android.support.constraint.ConstraintLayout>

主活動.java

    package cmput301.subbook;

    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import java.util.ArrayList;

    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.view.View;
    import android.widget.ArrayAdapter;

    import java.util.List;



    public class MainActivity extends AppCompatActivity {

        private TextView text;
        private List<String> subListVal;

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

            text = (TextView) findViewById(R.id.mainText);

            ArrayList<String> subListVal = new ArrayList<String>();
          //  subListVal = new ArrayList<String>();

            subListVal.add("Netflix");
            subListVal.add("Github");
            subListVal.add("Spotify");
            subListVal.add("Gym");


          /*  ArrayAdapter<String> adapter;

            adapter = new ArrayAdapter <String>(this, R.layout.list_rows, R.id.listText, subListVal);

            ListView listView = (ListView) findViewById(android.R.id.list);
            listView.setAdapter(adapter); */

            CustomAdapter adapter = new CustomAdapter(subListVal, this);

            //handle listview and assign adapter
            ListView lView = (ListView)findViewById(android.R.id.list);
            lView.setAdapter(adapter);

           /* Button add_btn = new Button(this);
            add_btn.setText("Add New");
            lView.addFooterView(add_btn); */

        }


        }

list_rows.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TextView
        android:id="@+id/listText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textSize="20sp"
        android:textColor="#ffe600" />

        <Button
            android:id="@+id/delete_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp"
            android:text="Delete" />


        <Button
            android:id="@+id/edit_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/delete_btn"
            android:layout_centerVertical="true"
            android:layout_marginRight="10dp"
            android:text="Edit" />



    </LinearLayout>

客戶適配器.java

package cmput301.subbook;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by thesh on 2/3/2018.
 */

public class CustomAdapter extends BaseAdapter implements ListAdapter {
    private ArrayList<String> list= new ArrayList<String>();
    private Context context;

    public CustomAdapter(ArrayList<String> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int pos) {
        return list.get(pos);
    }

    @Override
    public long getItemId(int pos) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.list_rows, null);
        }

        //Handle TextView and display string from your list
        TextView listItemText = (TextView)view.findViewById(R.id.listText);
        listItemText.setText(list.get(position));

        //Handle buttons and add onClickListeners
        Button deleteBtn = (Button)view.findViewById(R.id.delete_btn);
        Button editBtn = (Button)view.findViewById(R.id.edit_btn);

        deleteBtn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {

                list.remove(position); //or some other task
                notifyDataSetChanged();
            }
        });
        editBtn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {

                notifyDataSetChanged();
            }
        });

        return view;
    }


}

從字面上看,我的應用程序正在運行,突然間我得到了這個錯誤,但沒有太大變化。 我所做的最后一個更改是嘗試在列表的 footer_view 添加一個按鈕。 我嘗試谷歌搜索 logchat 錯誤無濟於事。

將不勝感激的幫助。 謝謝。

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference at cmput301.subbook.MainActivity.onCreate(MainActivity.java:49) 

這告訴您MainActivity中的第 49 行有您的問題,在setAdapter()調用中,您正在調用它的內容為null

這似乎是這一行:

lView.setAdapter(adapter);

這意味着lViewnull

您嘗試在上一行中為lView分配一個值:

ListView lView = (ListView)findViewById(android.R.id.list);

如果lViewnull ,則findViewById(android.R.id.list)將返回null 這意味着 Android 無法在您的布局中找到android:id值為@android:id/list

那是因為您的ListView具有不同的 ID 值:

 <ListView
    android:id="@+id/listView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/mainText"
    android:background="#e6a1a1"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="0dp" />

這些需要排隊。 所以,要么:

  • <ListView>中的android:id更改為@android:id/list ,或

  • 更改您的findViewById()調用以查找R.id.listView

改變這個ListView lView = (ListView)findViewById(android.R.id.list);

ListView lView = (ListView)findViewById(R.id.listView);

改變——

ListView lView = (ListView)findViewById(android.R.id.list); 

-

ListView lView = (ListView)findViewById(R.id.listview);

暫無
暫無

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

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