2016-11-08 63 views
1

)在我的应用程序中,我试图在用户决定关闭ExpandedControlsActivity(Mini控制器的全屏版本)时显示to implement a MiniControlFragment。我不需要声明性地将它添加到xml布局,而是需要以编程方式进行。当在MiniControllerFragment中调用super.onCreateView()时出现NullPointerException(

所以我创建了自己的类延伸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(); 
      } 
     } 
    } 

} 

我实例化它,它在ActivityonResume回调:

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

这是Activity“添加到片段Transaction对象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> 

但是,当我CastControllingFragmentsuper.onCreateView()被称为然后我得到以下错误:

java.lang.RuntimeException: Unable to resume activity java.lang.NullPointerException: Attempt to read from null array at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3400) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Caused by: java.lang.NullPointerException: Attempt to read from null array at com.google.android.gms.cast.framework.media.widget.MiniControllerFragment.zza(Unknown Source) at com.google.android.gms.cast.framework.media.widget.MiniControllerFragment.onCreateView(Unknown Source) at com.google.sample.cast.refplayer.CastControllingFragment.onCreateView(CastControllingFragment.java:22) at android.support.v4.app.Fragment.performCreateView(Fragment.java:2087) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682) at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:388) at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:499) at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:175) at android.app.Activity.performResume(Activity.java:6792) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3377) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:6077)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

+0

为什么downvote呢? – flyingAssistant

回答

3

有在最新的SDK铸造与旧版本的谷歌游戏服务使得它不兼容(崩溃)的变化。 不幸的是,即使使用带有过时GPS(或模拟器)的最新Cast SDK,也会造成示例应用程序崩溃。 的问题已经在这里讨论:https://github.com/googlecast/CastVideos-android/issues/12

解决的办法是检查谷歌初始化任何铸造部件,包括微型控制器之前播放服务的版本(即你不能只是把微型控制器片段到您的XML布局文件 - 你要么必须动态膨胀它,或者有两个布局文件 - 一个和一个没有你的迷你控制器)。

代码来检查GPS版本:

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

如果结果不是ConnectionResult.SUCCESS,不初始化你MiniControllerFragment

此外,请记住它是而不是可能使用new MiniControllerFragment()实例化MiniControllerFragment。您必须从xml充值它,否则您将获得NullPointerException

有两种方式膨胀MiniControllerFragment

  1. 创建单独的XML布局文件和膨胀在Activity.onCreate合适的一个:

    setContentView(isGPSAvailable ? R.layout.activity_main_with_controller : R.layout.activity_main_without_controller); 
    
  2. 创建布局ViewStub指向MiniControllerFragment和膨胀它只有当你有播放服务。

活动布局:

<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(); 
} 

我喜欢ViewStub AP因为它不会重复您的布局。

+0

感谢卡米尔,伟大的说明:) – flyingAssistant

+0

好方法与存根 – ddd

0

我希望这可以帮助你。

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(); 
    } 
} 

这是ActivityFragment例如

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; 
    } 
} 
+0

嗨克里斯蒂安,我试过你的解决方案,但我仍然得到相同的错误 – flyingAssistant

+0

尝试添加代码暂停方法。 –

相关问题