2013-08-03 3 views
0

Итак, прочитав официальное руководство на веб-сайте Android около DialogFragment, я решил использовать его самостоятельно. Код, как показано ниже:NullPointerException при попытке отобразить DialogFragment

@Override 
    public void feedItemSelected(Feed item) { 
     if(isXHDPI == true){ 
      FragmentManager fm = getSupportFragmentManager(); 
      VideoFragment videoFragment = (VideoFragment) fm.findFragmentById(R.id.videoFragment); 
      videoFragment.displayNewFeed(item); 
     }else{ 
      //TODO add DialogFragment support 
      VideoDialog v = new VideoDialog(); 
      v.show(getSupportFragmentManager(), "dialog"); 
      v.showNewVideo(item); 
     } 
    } 

Этот кусок кода из MainActivity. Он реализует слушателя для получения событий от другого Fragment и отвечает на него соответствующим образом. В случае таблеток он отображает данные в другом фрагменте. В случае небольших телефонов мне нужно отобразить DialogFragment, где пользователь может посмотреть видео.

Тем не менее, я получаю NullPointerException на маленьких телефонах. Другими словами, DialogFragment никогда не отображается. Почему?



VideoDialog:

import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.DialogFragment; 
import android.text.Html; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.MediaController; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.VideoView; 

public class VideoDialog extends DialogFragment { 

    MediaController controls = null; 
    VideoView video = null; 
    TextView title = null; 
    TextView date = null; 
    TextView description = null; 
//------------------------------------------------------------------------------ 
     @Override 
     public void onCreate(Bundle savedInstanceState){ 
      super.onCreate(savedInstanceState); 
     } 
//------------------------------------------------------------------------------ 
     @Override 
     public View onCreateView(LayoutInflater inflater, 
       ViewGroup container, 
       Bundle savedInstanceState){ 
      return inflater.inflate(
        R.layout.video_fragment, 
        container, 
        false); // inflate the fragment layout 
     } 
//------------------------------------------------------------------------------ 
     @Override 
     public void onStart(){ 
      super.onStart(); 

      controls = new MediaController(getActivity()); 

      title = (TextView) getActivity().findViewById(R.id.title); 
      date = (TextView) getActivity().findViewById(R.id.date); 
      description = (TextView) getActivity().findViewById(R.id.description); 
      video = (VideoView) getActivity().findViewById(R.id.video); 

      controls.setAnchorView(video); 
      video.setMediaController(controls); 

     } 
//------------------------------------------------------------------------------ 
     public void showNewVideo(Feed f){ 
      title.setText(f.getTitle()); 
      date.setText(f.getDate()); 
      description.setText(Html.fromHtml(f.getDescription())); 


      video.setVideoURI(Uri.parse(f.getVideoURL())); 
      video.start(); 

      Toast.makeText(getActivity(), "Video started", Toast.LENGTH_LONG).show(); 
     } 
//------------------------------------------------------------------------------ 
} 


StackTrace:

08-03 11:22:35.944: E/AndroidRuntime(801): FATAL EXCEPTION: main 
08-03 11:22:35.944: E/AndroidRuntime(801): java.lang.NullPointerException 
08-03 11:22:35.944: E/AndroidRuntime(801): at com.example.tqafragments.VideoDialog.showNewVideo(VideoDialog.java:55) 
08-03 11:22:35.944: E/AndroidRuntime(801): at com.example.tqafragments.MainActivity.feedItemSelected(MainActivity.java:36) 
08-03 11:22:35.944: E/AndroidRuntime(801): at com.example.tqafragments.FeedFragment$2.onItemClick(FeedFragment.java:73) 
08-03 11:22:35.944: E/AndroidRuntime(801): at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
08-03 11:22:35.944: E/AndroidRuntime(801): at android.widget.AbsListView.performItemClick(AbsListView.java:1100) 
08-03 11:22:35.944: E/AndroidRuntime(801): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749) 
08-03 11:22:35.944: E/AndroidRuntime(801): at android.widget.AbsListView$1.run(AbsListView.java:3423) 
08-03 11:22:35.944: E/AndroidRuntime(801): at android.os.Handler.handleCallback(Handler.java:725) 
08-03 11:22:35.944: E/AndroidRuntime(801): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-03 11:22:35.944: E/AndroidRuntime(801): at android.os.Looper.loop(Looper.java:137) 
08-03 11:22:35.944: E/AndroidRuntime(801): at android.app.ActivityThread.main(ActivityThread.java:5041) 
08-03 11:22:35.944: E/AndroidRuntime(801): at java.lang.reflect.Method.invokeNative(Native Method) 
08-03 11:22:35.944: E/AndroidRuntime(801): at java.lang.reflect.Method.invoke(Method.java:511) 
08-03 11:22:35.944: E/AndroidRuntime(801): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
08-03 11:22:35.944: E/AndroidRuntime(801): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
08-03 11:22:35.944: E/AndroidRuntime(801): at dalvik.system.NativeStart.main(Native Method) 
+1

StackTrace ?? Где NPE? – Tarun

+0

@Tarun Пожалуйста, проверьте правильность настройки –

+0

Что такое номер строки 'VideoDialog.java: 55'? – Tarun

ответ

1

DialogFragment создается как

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    View view = getActivity().getLayoutInflater().inflate(R.layout.video_fragment, null); 
    builder.setView(view); 
    title = (TextView) view.findViewById(R.id.title); 
    date = (TextView) view.findViewById(R.id.date); 
    description = (TextView) view.findViewById(R.id.description); 
    video = (VideoView) view.findViewById(R.id.video); 
    return builder.create(); 
} 
+0

Итак, чтобы использовать этот код, я должен избавиться от переопределения 'onCreateView'? :) –

+0

Yea onCreateView не требуется. – Tarun

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