Android 如果在横向模式下启动,则在设置自定义适配器时获取nullpointerexception
我在项目中遇到了一些奇怪的问题,在横向模式下启动时,它会触发空指针适配器。现在的问题是,我有一个gridview,因为它是我唯一的最佳选择。现在,适配器非常简单:Android 如果在横向模式下启动,则在设置自定义适配器时获取nullpointerexception,android,gridview,Android,Gridview,我在项目中遇到了一些奇怪的问题,在横向模式下启动时,它会触发空指针适配器。现在的问题是,我有一个gridview,因为它是我唯一的最佳选择。现在,适配器非常简单: public class ActionsAdapter extends BaseAdapter { Context context; public ActionsAdapter(Context context){ this.context = context; } @Overrid
public class ActionsAdapter extends BaseAdapter {
Context context;
public ActionsAdapter(Context context){
this.context = context;
}
@Override
public int getCount() {
return 2;
}
@Override
public Object getItem(int i) {
return i;
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView;
if(i==0) {
rowView = inflater.inflate(R.layout.button1, viewGroup, false);
Button button1 = (Button) rowView.findViewById(R.id.btn_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPage();
}
});
}else{
rowView = inflater.inflate(R.layout.button2, viewGroup, false);
}
return rowView;
}
private void showPage(){
//TODO show page
}
现在,我所做的只是以我认为自然的方式将这个适配器设置到我的gridview中:
actions.setAdapter(new ActionsAdapter(getActivity()));
现在,这在纵向模式下非常有效,但是如果在landscapemode上启动,它将返回一个null指针exeption,它将在设置适配器时指向上面的代码
以下是完整日志:
FATAL EXCEPTION: main
Process: com.gmanmi.news.papalvisit2014.mobile, PID: 18353
java.lang.NullPointerException
at com.kahel.sample.fragments.Testfragment.onCreateView(Testfragment.java:93)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1504)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:942)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:482)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1073)
at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
at android.support.v4.view.ViewPager$3.run(ViewPager.java:249)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:543)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5105)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
at dalvik.system.NativeStart.main(Native Method)
以下是onCreateView:
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
final Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_grid_actions, container, false);
actions = (GridView) view.findViewById(R.id.grid_actions);
actions.setAdapter(new ActionsAdapter(getActivity()));
actions.setOnItemClickListener(new AdapterView.OnItemClickListener() {
enter code here
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if(position==1){
Toast.makeText(getActivity(), "Show action", Toast.LENGTH_SHORT).show();
}
}
});
return view;
}
@覆盖
创建视图上的公共视图(布局、充气机、最终视图组容器、,
最终捆绑包保存状态(STANCESTATE){
最终视图=充气机。充气(R.layout.fragment\u grid\u动作,容器,错误);
actions=(GridView)view.findviewbyd(R.id.grid\u actions);
actions.setAdapter(新的ActionsAdapter(getActivity());
actions.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
在这里输入代码
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
如果(位置==1){
Toast.makeText(getActivity(),“Show action”,Toast.LENGTH_SHORT.Show();
}
}
});
返回视图;
}
您的问题在于在onCreateView
中调用getActivity
。您无法安全地执行此操作,因为无法保证此时已完全创建活动,因此NPE。将调用移动到setAdapter
,并将后续调用移动到onActivityCreated
也许可以帮助您更好地理解如何处理此问题。您的问题是在
onCreateView
中调用getActivity
。您无法安全地执行此操作,因为无法保证此时已完全创建活动,因此NPE。将调用移动到setAdapter
,并将后续调用移动到onActivityCreated
也许可以帮助您更好地理解如何处理此问题。您的问题是在
onCreateView
中调用getActivity
。您无法安全地执行此操作,因为无法保证此时已完全创建活动,因此NPE。将调用移动到setAdapter
,并将后续调用移动到onActivityCreated
也许可以帮助您更好地理解如何处理此问题。您的问题是在
onCreateView
中调用getActivity
。您无法安全地执行此操作,因为无法保证此时已完全创建活动,因此NPE。将调用移动到setAdapter
,并将后续调用移动到onActivityCreated
也许可以帮助您更好地理解如何处理此问题。@2Dee是正确的。当您在
onCreateView
中使用getActivity
时,您无法知道此活动是否在此时创建
请看他的答案,以获得更精确的答案 @2Dee是正确的当您在
onCreateView
中使用getActivity
时,您无法知道此活动是否在此时创建
请看他的答案,以获得更精确的答案 @2Dee是正确的当您在
onCreateView
中使用getActivity
时,您无法知道此活动是否在此时创建
请看他的答案,以获得更精确的答案 @2Dee是正确的当您在
onCreateView
中使用getActivity
时,您无法知道此活动是否在此时创建
请看他的答案,以获得更精确的答案 您可以发布Testfragment的onCreateView吗?发布了onCreateView,但我需要截断某些部分(设置视图),我确定这不是错误的原因。可能是view.findViewById(R.id.grid_actions)返回空值。如果您有一个单独的xml用于横向布局,那么请检查纵向布局和横向布局中的grid_actions id是否相同。我只有一个xml布局。我还认为该视图返回null,但不知道为什么它只在横向启动时才会发生。好的,在检查它之后,我已经指出了问题的真正原因,因为以前我有一个单独的横向xml布局,我已经删除了它,但还没有清理它,并创建了一个null指针。在第一次清洁时,我不确定为什么它不起作用,但在第二次尝试时,它就起作用了。谢谢@samgak的想法。你能发布Testfragment的onCreateView吗?发布了onCreateView,尽管我需要截断某些部分(设置视图),我确定这不是错误的原因。可能是view.findViewById(R.id.grid_actions)返回空值。如果您有一个单独的xml用于横向布局,那么请检查纵向布局和横向布局中的grid_actions id是否相同。我只有一个xml布局。我还认为该视图返回null,但不知道为什么它只在横向启动时才会发生。好的,在检查它之后,我已经指出了问题的真正原因,因为以前我有一个单独的横向xml布局,我已经删除了它,但还没有清理它,并创建了一个null指针。在第一次清洁时,我不确定为什么它不起作用,但在第二次尝试时,它就起作用了。谢谢@samgak的想法。你能发布Testfragment的onCreateView吗?发布了onCreateView,尽管我需要截断某些部分(设置视图),我确定这不是错误的原因。可能是view.findViewById(R.id.grid_actions)返回空值。如果您有一个单独的xml用于横向布局,那么请检查纵向布局和横向布局中的grid_actions id是否相同。我只有一个xml布局。我还认为视图返回null,但不知道为什么它只在横向启动时发生