2016-11-08 64 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

嘗試添加代碼暫停方法。 –

相關問題