代码之家  ›  专栏  ›  技术社区  ›  flyingAssistant

调用super时出现NullPointerException。MiniControllerFragment中的onCreateView()

  •  2
  • flyingAssistant  · 技术社区  · 9 年前

    在我的应用程序中,我正在尝试 to implement a MiniControlFragment 当用户决定关闭时显示 ExpandedControlsActivity (迷你控制器的全屏版本)。我需要以编程方式将其添加到xml布局中,而不是以声明方式添加。

    所以我创建了自己的类,它扩展了 MiniControllerFragment :

    public class CastControllingFragment extends MiniControllerFragment
    {
        @Override
        public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle bundle)
        {
            View view = super.onCreateView(layoutInflater, viewGroup, bundle);
            if (view != null) {
                FrameLayout.LayoutParams frameLayoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                view.setLayoutParams(frameLayoutParams);
            }
            return view;
        }
    
        public static void show(FragmentActivity activity) {
            FragmentManager fragmentManager = activity.getSupportFragmentManager();
            if (fragmentManager.findFragmentById(R.id.castMiniController) == null)
            {
                View rootView = activity.findViewById(R.id.fragment_container);
                if (rootView instanceof ViewGroup)
                {                    
                   fragmentManager.beginTransaction().add(R.id.fragment_container, new CastControllingFragment()).commit();
                }
            }
        }
    
    }
    

    我实例化它并将其添加到中的片段事务中 Activity onResume 回调:

        @Override
        protected void onResume() {
            CastControllingFragment.show(this);
            super.onResume();
        }
    

    这是 活动 的布局 FrameLayout

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:app="http://schemas.android.com/apk/res-auto"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
        <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </FrameLayout>
    
    </RelativeLayout>
    

    super.onCreateView() 在我 CastControllingFragment 调用,则我得到以下错误:

    java.lang.RuntimeException:无法恢复活动 java.lang.NullPointerException:尝试从空数组读取 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:3400) 在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440) 在 在android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 在android.os.Handler.dispatchMessage中(Handler.java:102) 在android.os.Looper.loop中(Looper.java:154) 在android.app.ActivityThread.main(ActivityThread.java:6077) 在java.lang.reflect.Method中。调用(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(zygoTenit.java:865)

    原因:java.lang.NullPointerException:尝试从null读取 大堆 在 com.google.android.gms.cast.framework.media.widget.MiniControllerFragment.zza(未知 (来源) 在 com.google.android.gms.cast.framework.media.widget.MiniControllerFragment.onCreateView(未知 (来源) 在 com.google.sample.cast.refplayer.CastControllingFragment.onCreateView(castControlingFragment.java:22) 在 android.support.v4.app.Fragment.performCreateView(Fragment.java:2087) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) 在 android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) 在 android.support.v4.app.FragmentManagerImpl.ExependingActions(FragmentManager.java:1682) 在 android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388) 在 android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:499) 在 android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:175) 在android.app.Activity.performResume(Activity.java:6792) 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:3377) 在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713) 在android.app.ActivityThread.-wrap12(ActivityThread.java) 在 在android.os.Handler.dispatchMessage中(Handler.java:102) 在android.os.Looper.loop中(Looper.java:154) 在android.app.ActivityThread.main(ActivityThread.java:6077) 在java.lang.reflect.Method中。调用(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(zygoTenit.java:865) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

    2 回复  |  直到 9 年前
        1
  •  5
  •   Kamil Ślesiński    9 年前

    最新的Cast SDK发生了变化,使其与旧版本的Google Play服务不兼容(崩溃)。 不幸的是,当使用带有过时GPS(或模拟器)的最新cast SDK时,即使cast示例应用程序也会崩溃。 这里讨论了这个问题: https://github.com/googlecast/CastVideos-android/issues/12

    GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
    int resultCode = apiAvailability.isGooglePlayServicesAvailable(context);
    isGPSAvailable = (resultCode == ConnectionResult.SUCCESS);
    

    如果结果不是 ConnectionResult.SUCCESS 或者,不要初始化 MiniControllerFragment .

    此外,请记住 可以实例化 微型控制器碎片 使用 new MiniControllerFragment() .您必须从xml中扩展它,否则您将得到 NullPointerException .

    有两种方法可以充气 微型控制器碎片 :

    1. 创建单独的xml布局文件,并在 Activity.onCreate :

      setContentView(isGPSAvailable ? R.layout.activity_main_with_controller : R.layout.activity_main_without_controller);
      
    2. 创造 ViewStub 微型控制器碎片 只有当你有游戏服务时才充气。

    活动布局:

    <ViewStub
    android:id="@+id/cast_minicontroller"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout="@layout/cast_mini_controller_fragment"
    />
    

    cast_mini_controller_fragment:

    <?xml version="1.0" encoding="utf-8"?>
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/castMiniController"
              class="com.google.android.gms.cast.framework.media.widget.MiniControllerFragment"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:visibility="gone"/>
    

    活动中的代码 onCreate() :

    ViewStub miniControllerStub = (ViewStub) findViewById(R.id.cast_minicontroller);
    if (isGPSAvailable) {
        miniControllerStub.inflate();
    }
    

    我更喜欢 视窗存根

        2
  •  0
  •   Cristian Cardoso    9 年前

    我希望这能帮助你。

     private void displayViewFromDrawer(int position, @Nullable String  textTitle) {
        Fragment fragment = null;
        switch (position){
            case 1: //Activity record
                ActivityFragment.newInstance(current_date_string);
                break;
        }
        if (fragment != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_frame, fragment,"fragment_container");
            ft.addToBackStack(null);
            ft.commit();
        }
    }
    

     public class ActivityFragment extends Fragment{
       public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
        View v = inflater.inflate(R.layout.fragment_activity_main, container, false);
    
       //In here you can cast TextViews,Buttons,etc...
    
       return v;
     }
    
      public static ActivityFragment newInstance(String date) {
        ActivityFragment fragment = new ActivityFragment();
        Bundle args = new Bundle();
        args.putString("title", date);
        fragment.setArguments(args);
        return fragment;
      }
    }