无法从Fragment获取上下文

时间:2015-06-04 23:16:05

标签: java android android-fragments android-arrayadapter

我试图从一个活动中调用一个片段方法,但是在该方法中使用getActivity()设置适配器上下文时,我得到一个空指针异常:

片段方法

public void fragmentMethod() {
            String[] names = new String[]{"name1", "name2", "name3"};
            String[] values = new String[]{value1, value2, value3};
            adapter = new MyArrayAdapter(getActivity(), names, values);
            setListAdapter(adapter);
}

适配器

public class MyArrayAdapter extends ArrayAdapter<String> {

    private final Context context;
    private final String[] names;
    private final String[] values;

    public MyArrayAdapter (Context context, String[] names, String[] values) {
        super(context, R.layout.rowlayout, values);
        this.context = context;
        this.names = names;
        this.values = values;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ...
    }

}

从活动调用碎片方法

public void activityMethod() {
    FragmentName  test= new FragmentName();
    test.fragmentMethod();
}

我尝试了很多不同的事情,我在这里不知所措......如果我在想要做的事情上根本不对,请告诉我,因为我是新手。谢谢!

编辑:堆栈跟踪

Inventory是Fragment类)

这是在点击调用activityMethod()

的图像视图后
06-04 19:55:17.976    1147-1147/company.com.myapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
        at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
        at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128)
        at company.com.myapp.MyArrayAdapter.<init>(MyArrayAdapter.java:18)
        at company.com.myapp.Inventory.createList(Inventory.java:105)
        at company.com.myapp.MainActivity.newDay(MainActivity.java:177)
        at company.com.myapp.MainActivity$2.onClick(MainActivity.java:91)
        at android.view.View.performClick(View.java:4240)
        at android.view.View$PerformClick.run(View.java:17721)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

3 个答案:

答案 0 :(得分:4)

  

如果我在尝试做的事情上根本不对,请告诉我,因为我是新手

在片段附加到活动之前,您无法调用getActivity()并获得响应。如果是动态片段 - 您正在通过构造函数直接创建 - 这将在您commit() FragmentTransaction之后的某个时间将片段放入FragmentManager

此外,在ListView准备就绪之前设置适配器是没有意义的。

因此,只需将fragmentMethod()代码移至片段上的an onViewCreated() method即可。这将在片段附加到活动的时间点调用ListView已准备好接收适配器。

答案 1 :(得分:0)

从上面的代码中,您的片段未与任何活动相关联。因此,getActivity()调用将返回null,直到您将片段附加到活动。

private void activityMethod() {
    MyFragment fragment = new MyFragment();
    getSupportFragmentManager().beginTransaction()
            .add(fragment, "myfragment").commit();
    fragment.fragmentMethod();
}

答案 2 :(得分:0)

onActivityCreated()内或onAttach()

内执行此操作