【问题标题】:Cannot Pass Arraylist<Object> values to the Fragment无法将 Arraylist<Object> 值传递给片段
【发布时间】:2016-07-31 18:18:03
【问题描述】:

美好的一天!

我很难解决这个问题。我尝试实现接口、可打包对象和捆绑包,只是为了与片段进行通信。但是在我运行我的代码之后,它每次在 Fragment 类中都会出现 NullPointerException。这是错误:

07-31 18:09:42.052 4776-4776/bwrt.monsters.android.com.blesswhoreadthis E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                      java.lang.RuntimeException: Unable to start activity ComponentInfo{bwrt.monsters.android.com.blesswhoreadthis/bwrt.monsters.android.com.blesswhoreadthis.Activity.MainActivity}: java.lang.NullPointerException
  at android.app.ActivityThread.performLaunchActivity  (ActivityThread.java:2059)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2084)
  at android.app.ActivityThread.access$600(ActivityThread.java:130)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:137)
  at android.app.ActivityThread.main(ActivityThread.java:4745)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:511)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
  at dalvik.system.NativeStart.main(Native Method)
  Caused by: java.lang.NullPointerException
  at wrt.monsters.android.com.blesswhoreadthis.Fragment.GenesisFragment.onCreate(GenesisFragment.java:58)
                                                                                          at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:796)
                                                                                          at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
                                                                                          at android.app.BackStackRecord.run(BackStackRecord.java:635)
                                                                                          at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397)
                                                                                          at android.app.Activity.performStart(Activity.java:5017)
                                                                                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2032)
                                                                                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
                                                                                          at android.app.ActivityThread.access$600(ActivityThread.java:130) 
                                                                                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
                                                                                          at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                                          at android.os.Looper.loop(Looper.java:137) 
                                                                                          at android.app.ActivityThread.main(ActivityThread.java:4745) 
                                                                                          at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                                          at java.lang.reflect.Method.invoke(Method.java:511) 
                                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
                                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
                                                                                          at dalvik.system.NativeStart.main(Native Method) 

这是我的片段类:

public class GenesisFragment extends Fragment {

Context mContext;
ListView lv;
ArrayList<Bible> verseList=null;
VerseAdapter verseAdapter;
displayDataInterface listeners;

public interface displayDataInterface {
  Bundle displayData();

}


@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof displayDataInterface) {
        this.listeners= (displayDataInterface) context;
    }else {
        throw new ClassCastException(context.toString()+" must implement the NEEDED INTERFACE!");
    }
}

/** @Override */
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Bundle bundle=listeners.displayData();

    if (bundle.isEmpty()) {
       Log.e("BUNDLE","EMPTY");
    }else {
        verseList= bundle.getParcelableArrayList("verseValues");
    }

    verseAdapter= new VerseAdapter(mContext,verseList);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v= inflater.inflate(R.layout.fragment_genesis, container, false);

    return v;



}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {

    lv=(ListView)getActivity().findViewById(R.id.listview_genesis);

    lv.setAdapter(verseAdapter);
    verseAdapter.notifyDataSetChanged();


}

}

我的 MainActivity Class 部分,我在接口方法中实现了 Bundles (_bibleValues- 一个 ArrayList):

 /** Interface Generated Methods*/
@Override
public Bundle displayData() {

    GenesisFragment gFragment= new GenesisFragment();
    Bundle args= new Bundle();
    args.putParcelableArrayList("verseValues",_bibleValues); //Make the Object class Parcelable 1st
    gFragment.setArguments(args);

    return args;
}

我的对象等级:

public class Bible implements Parcelable{
private int id;
private int book;
private int chapter;
private int verseCount;
private String verseContent;
/** Constructors */
public Bible(int _id,int _book, int _chapter,int _verseCount, String _verseContent) {
    this.id=_id;
    this.book=_book;
    this.chapter=_chapter;
    this.verseCount=_verseCount;
    this.verseContent=_verseContent;
}


protected Bible(Parcel in) {
    id = in.readInt();
    book = in.readInt();
    chapter = in.readInt();
    verseCount = in.readInt();
    verseContent = in.readString();
}

public static final Creator<Bible> CREATOR = new Creator<Bible>() {
    @Override
    public Bible createFromParcel(Parcel in) {
        return new Bible(in);
    }

    @Override
    public Bible[] newArray(int size) {
        return new Bible[size];
    }
};


/** Getters and Setters */
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public int getBook() {
    return book;
}

public void setBook(int book) {
    this.book = book;
}

public int getChapter() {
    return chapter;
}

public void setChapter(int chapter) {
    this.chapter = chapter;
}

public int getVerseCount() {
    return verseCount;
}

public void setVerseCount(int verseCount) {
    this.verseCount = verseCount;
}

public String getVerseContent() {
    return verseContent;
}

public void setVerseContent(String verseContent) {
    this.verseContent = verseContent;
}



@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeInt(book);
    dest.writeInt(chapter);
    dest.writeInt(verseCount);
    dest.writeString(verseContent);
}

}

每次我运行程序时,它总是在 Fragment 类的 onCreate 中指出错误。谁能向我解释这个错误的根本原因并建议我防止这种情况发生的想法?

提前致谢!

【问题讨论】:

  • _bibleValues的类型是什么?
  • @skywall- 一个对象先生。因为我有一个可打包的对象,所以只是为了实现 Bundle 方法。
  • 我的对象由 4 个整数和 1 个字符串组成。
  • 在这种情况下说Object 非常具有误导性。 Object 是 Java 基类。下次称它为“我的班级圣经”。

标签: android android-fragments arraylist interface nullpointerexception


【解决方案1】:

你的错误在这里

lv=(ListView)getActivity().findViewById(R.id.listview_genesis);

在哪里,findViewById 已返回 null,因为我假设 Activity XML 布局不包含该 ListView,但 Fragment XML 布局包含。


您可以在onCreateView 中进行大部分操作,

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v= inflater.inflate(R.layout.fragment_genesis, container, false);
    lv = v.findViewById(R.id.listview_genesis);

    if (listeners != null) {
        Bundle bundle=listeners.displayData();

        if (bundle.isEmpty()) {
           Log.e("BUNDLE","EMPTY");
        } else {
            verseList= bundle.getParcelableArrayList("verseValues");
            verseAdapter= new VerseAdapter(getActivity(), verseList);
            lv.setAdapter(verseAdapter);
        }
    }

    return v;

}

实际上,displayData() 是该方法的一个糟糕的名称,而且大多数情况下都是错误的方式来做你想做的事情,因为你创建了一个 new GenesisFragment,设置了参数,然后什么都不做。

它应该返回Fragment,而不是Bundle,它不显示数据,它只是返回一个值。

看起来您试图实现类似instantiating a Fragment 的目标,其中newInstance 方法不在Activity 类中,而是在Fragment 类中,并且您将该实例从Activity 加载到FragmentManager 中。

【讨论】:

  • 感谢您的帮助。我可以知道如何附加上下文的代码吗?对不起先生,我的困惑。
  • 您不应该在 Fragment 类中需要 mContext,当您确实需要上下文时,您可以在这些实例中访问 getActivity() 方法。
  • 谢谢,我更改了 onAttach() 中的代码,它运行良好。但是我现在的问题是我的arraylist里面的片段是相等的,但是我调用了Bundle方法来检索接口方法中的参数。
  • 抱歉,“相等”是什么意思?
  • 道歉,我的意思是我的数组列表在片段内是“空的”。抱歉错字了。
猜你喜欢
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
相关资源
最近更新 更多