Java 无法从片段中获取上下文

Java 无法从片段中获取上下文,java,android,android-fragments,android-arrayadapter,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 =

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

}
我已经尝试了很多不同的事情,我在这里不知所措…如果我在我尝试做的事情上根本错误,请让我知道,因为我是一个新手。谢谢大家!

编辑:堆栈跟踪

Inventory
是片段类)

这是在单击调用
activityMethod()

06-04 19:55:17.976 1147-1147/company.com.myapp E/AndroidRuntime﹕ 致命异常:主
java.lang.NullPointerException
位于android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
位于android.widget.ArrayAdapter.(ArrayAdapter.java:128)
在company.com.myapp.MyArrayAdapter.(MyArrayAdapter.java:18)
位于company.com.myapp.Inventory.createList(Inventory.java:105)
位于company.com.myapp.MainActivity.newDay(MainActivity.java:177)
在company.com.myapp.MainActivity$2.onClick上(MainActivity.java:91)
在android.view.view.performClick上(view.java:4240)
在android.view.view$PerformClick.run(view.java:17721)
位于android.os.Handler.handleCallback(Handler.java:730)
位于android.os.Handler.dispatchMessage(Handler.java:92)
位于android.os.Looper.loop(Looper.java:137)
位于android.app.ActivityThread.main(ActivityThread.java:5103)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:525)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:737)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
在dalvik.system.NativeStart.main(本机方法)
如果我在我试图做的事情上根本错误,请让我知道,因为我是新手

在片段附加到活动之前,无法调用
getActivity()
并获取响应。对于动态片段(您直接通过构造函数创建的片段),这将在
commit()
a
FragmentTransaction
将该片段放入
FragmentManager
之后的某个时间发生

此外,在
ListView
准备就绪之前,没有必要设置适配器

因此,只需将
fragmentMethod()
代码移动到片段上即可。当片段连接到活动并且
ListView
准备好接收适配器时,将调用此函数

如果我在我试图做的事情上根本错误,请让我知道,因为我是新手

在片段附加到活动之前,无法调用
getActivity()
并获取响应。对于动态片段(您直接通过构造函数创建的片段),这将在
commit()
a
FragmentTransaction
将该片段放入
FragmentManager
之后的某个时间发生

此外,在
ListView
准备就绪之前,没有必要设置适配器


因此,只需将
fragmentMethod()
代码移动到片段上即可。这将在片段连接到活动且
列表视图准备好接收适配器时调用。

根据上面的代码,片段未与任何活动关联。所以
getActivity()
调用将返回null,直到您将片段附加到活动

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

根据上面的代码,您的片段没有与任何活动关联。所以
getActivity()
调用将返回null,直到您将片段附加到活动

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

onActivityCreated()
onatach()
内部执行该操作在
onActivityCreated()
onatach()内部执行该操作可以发布堆栈跟踪吗?从何处调用
activityMethod()
?片段的
onAttach()
方法是在
fragmentMethod()
之前调用的吗?@pathfinderite我在
onCreate()之后的活动中调用了
activityMethod()。使用堆栈跟踪进行编辑。调试非常新,因此我无法回答是否调用了
onAttach()
。。您可以发布堆栈跟踪吗?从何处调用
activityMethod()
?片段的
onAttach()
方法是在
fragmentMethod()
之前调用的吗?@pathfinderite我在
onCreate()之后的活动中调用了
activityMethod()。使用堆栈跟踪进行编辑。对于调试来说非常陌生,所以我无法回答是否调用了
onAttach()
。。我最初在
onaapplicationcreated()
中使用了
fragmentMethod()
代码,它工作得很好(但将移动到
onViewCreated()
),但是,我必须将其移动到自定义方法,因为我需要从活动中调用它。如何从活动中调用其中一个方法中的部分代码?我应该考虑设置接口吗?谢谢@zngb:除了
null
getActivity()
问题之外,在创建
ListView
之前,您不能调用
setListAdapter()
,直到
onCreateView()
完成。如果您试图将数据传递到片段中,请使用工厂模式(static
newInstance()
方法)和参数
Bundle
,以便在配置更改等过程中保留数据。如果这些都是不可接受的,那么您只需要实现意大利面代码来处理
getActivity()
起作用和不起作用的情况,根据需要缓存信息,直到附加片段。我最初在
onApplicationCreated()中使用了
fragmentMethod()
代码,效果很好
private void activityMethod() {
    MyFragment fragment = new MyFragment();
    getSupportFragmentManager().beginTransaction()
            .add(fragment, "myfragment").commit();
    fragment.fragmentMethod();
}