无法从 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()
内执行此操作
我正在尝试从 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()