无法从 Fragment 获取上下文

Unable to get context from Fragment

我正在尝试从 activity 调用片段方法,但在该方法中使用 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) {
        ...
    }

}

从 Activity

调用片段方法
public void activityMethod() {
    FragmentName  test= new FragmentName();
    test.fragmentMethod();
}

我已经尝试了很多不同的东西,但我在这里不知所措...如果我在尝试做的事情上有根本错误,请让我知道,因为我是新手。谢谢!

编辑:堆栈跟踪

(Inventory 是片段 class)

这是在单击调用 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.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)

if I am fundamentally wrong in what I am trying to do, please let me know as I am a novice

在片段附加到 activity 之前,您无法调用 getActivity() 并获得响应。在动态片段的情况下——一个你直接通过构造函数创建的片段——这将在你 commit() 一个 FragmentTransaction 之后的某个时间将这个片段放入 FragmentManager.

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

因此,只需将您的 fragmentMethod() 代码移动到片段的 an onViewCreated() method 中。这将在片段附加到 activity ListView 准备好接收您的适配器时调用。

从上面的代码来看,您的片段没有关联到任何 activity。因此 getActivity() 调用将 return 为空,直到您将片段附加到 activity。

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

onActivityCreated()onAttach()

内执行此操作