2015-07-27 2 views
0

У меня проблема с DialogFragment.Исключение null null указателя диалога DialogFragment

Я удалил весь свой код и сделал DialogFragment максимально простым, и он действительно работает при вызове с MainActivity. Это код:

DatePickerFragment:

public class DatePickerFragment extends DialogFragment 
{ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     View rootView = inflater.inflate(R.layout.fragment_sample_dialog, container, false); 
     getDialog().setTitle("Simple Dialog"); 
     return rootView; 
    } 
} 

Вызов из MainActivity:

public void showDialog 
{ 
    FragmentManager fm = getFragmentManager(); 
    DatePickerFragment dialogFragment = new DatePickerFragment(); 
    dialogFragment.show(fm, "Sample Fragment"); 
} 

Но, если я называю showDialog из класса ActivityStarter, который имеет ссылку на MainActivity, это ошибка, которую я получаю:

java.lang.NullPointerException 
     at android.widget.AbsListView.obtainView(AbsListView.java:2353) 
     at android.widget.ListView.makeAndAddView(ListView.java:1812) 
     at android.widget.ListView.fillDown(ListView.java:698) 
     at android.widget.ListView.fillSpecific(ListView.java:1359) 
     at android.widget.ListView.layoutChildren(ListView.java:1623) 
     at android.widget.AbsListView.onLayout(AbsListView.java:2149) 
     at android.view.View.layout(View.java:15125) 
     at android.view.ViewGroup.layout(ViewGroup.java:4862) 
     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888) 
     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742) 
     at android.widget.LinearLayout.onLayout(LinearLayout.java:1651) 
     at android.view.View.layout(View.java:15125) 
     at android.view.ViewGroup.layout(ViewGroup.java:4862) 
     at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1160) 
     at android.view.View.layout(View.java:15125) 
     at android.view.ViewGroup.layout(ViewGroup.java:4862) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:450) 
     at android.view.View.layout(View.java:15125) 
     at android.view.ViewGroup.layout(ViewGroup.java:4862) 
     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888) 
     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742) 
     at android.widget.LinearLayout.onLayout(LinearLayout.java:1651) 
     at android.view.View.layout(View.java:15125) 
     at android.view.ViewGroup.layout(ViewGroup.java:4862) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:450) 
     at android.view.View.layout(View.java:15125) 
     at android.view.ViewGroup.layout(ViewGroup.java:4862) 
     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888) 
     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742) 
     at android.widget.LinearLayout.onLayout(LinearLayout.java:1651) 
     at android.view.View.layout(View.java:15125) 
     at android.view.ViewGroup.layout(ViewGroup.java:4862) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:450) 
     at android.view.View.layout(View.java:15125) 
     at android.view.ViewGroup.layout(ViewGroup.java:4862) 
     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888) 
     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742) 
     at android.widget.LinearLayout.onLayout(LinearLayout.java:1651) 
     at android.view.View.layout(View.java:15125) 
     at android.view.ViewGroup.layout(ViewGroup.java:4862) 
     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:450) 
     at android.view.View.layout(View.java:15125) 
     at android.view.ViewGroup.layout(ViewGroup.java:4862) 
     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2323) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2029) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1192) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6231) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:591) 
     at android.view.Choreographer.doFrame(Choreographer.java:560) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774) 
     at android.os.Handler.handleCallback(Handler.java:808) 
     at android.os.Handler.dispatchMessage(Handler.java:103) 
     at android.os.Looper.loop(Looper.java:193) 
     at android.app.ActivityThread.main(ActivityThread.java:5292) 
     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:824) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
     at dalvik.system.NativeStart.main(Native Method) 

Я действительно застрял и не могу найти решение. Любая помощь будет оценена по достоинству.

+0

Когда создается ActivityStarter? Вы возвращаете null в любом из createView в любом из классов? – Bajji

+0

MainActivity -> onCreate -> ActivityStarter activityStarter = new ActivityStarter(); Все остальное работает из 'activityStarter', единственная проблема, с которой я столкнулся, заключается в вызове' showDialog'. Я не возвращаю null. – marco

+0

Можете ли вы опубликовать фрагмент кода, в котором вы вызываете DialogFragment из класса ActivityStarter? – ucsunil

ответ

-1

В MainActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ActivityStarter activityStarter = new ActivityStarter(this); 
} 

public onSomeEvent() { 
    activityStarter.showDialog(); 
} 

В ActivityStarter:

Context context; 

ActivityStarter(Context context) { 
    this.context = context; 
} 

public void showDialog() { 
    FragmentManager fm = context.getFragmentManager(); 
    DatePickerFragment dialogFragment = new DatePickerFragment(); 
    dialogFragment.show(fm, "Sample Fragment"); 
} 
+0

Не возражаете ли вы хотя бы объяснить, почему это работает? –

+0

Как кто-то из предложенных комментариев OP, ActivityStarter не имеет правильного контекста для вызова getFragmentManager. Если OP не устанавливает это явно где-то не упоминается, должна произойти ошибка. – destroyer99

+1

'getFragmentManager' не является методом' Context' – marco

0

ОК, нашел причину. Спасибо всем, но проблема не вызвана DialogFragment, которая не имеет ничего общего с этим.

Крушение было вызвано вызовом метода непосредственно перед DialogFragment.show(), и это меня сбило с толку.

Я объясняю, хотя это никогда не поможет никому, как это проблема только моего кода:

Я открываю DatePickerFragment именно после того, как пользователь вставил свое имя. Прежде, имя было внутри ребенка группы ExpandableListView, поэтому я звонил expandGroup(), чтобы показать его. На самом деле имя больше не меняет, так что это не у ребенка, а в заблокированной группе ExpandableListView. Я просто забыл удалить звонок expandGroup(), который без детей вызывал сбой (вот почему проблема ListView).

Еще раз спасибо, сообщение здесь помогло мне в любом случае.

Смежные вопросы