2016-07-01 1 views
1

J'ai vu beaucoup de questions concernant Binary XML file line #2: Binary XML file line #2: Error inflating class fragment mais aucun d'eux n'est lié au mien et même en essayant certaines des solutions n'ont pas fonctionné.Android: l'application VerticalGridFragment provoque un blocage lors de l'utilisation de ErrorFragment?

Mon problème est que lorsque j'utilise un VerticalGridFragment et que je présente un ErrorFragment il se bloque. Toutefois, si je prolonge mon MainFragment pour utiliser DetailsFragment, l'application ne plante pas et je suis en mesure d'utiliser le ErrorFragment.

Voici mon exemple de code:

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/main_browse_fragment" 
    android:name="com.ui.MainFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.ui.MainActivity" 
    tools:deviceIds="tv" 
    tools:ignore="MergeRootFrame" /> 

MainActivity.java:

public class MainActivity extends Activity 
{ 
    private static final String TAG = "MyActivity"; 

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

MainFragment.java:

public class MainFragment extends VerticalGridFragment 
{ 
    public final ErrorFragment error = new ErrorFragment(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     displayInternetError(); 
    } 

    public void displayInternetError() 
    { 
     getFragmentManager().beginTransaction().replace(R.id.main_browse_fragment, error) 
       .addToBackStack(null).commit(); 

     error.setImageDrawable(getResources().getDrawable(R.drawable.lb_ic_sad_cloud, null)); 
     error.setMessage(getResources().getString(R.string.no_internet_message)); 
     error.setDefaultBackground(true); 

     error.setButtonText(getResources().getString(R.string.retry_connection)); 

     error.setButtonClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View arg0) 
      { 

      } 
     }); 
    } 

    ... 
} 

Mon Logcat:

FATAL EXCEPTION: main 
Process: com.example.vietmytv_androidtv, PID: 17619 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.vietmytv_androidtv/com.example.vietmytv_androidtv.ui.MainActivity}: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class fragment 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
    at android.os.Handler.dispatchMessage(Handler.java:102)      
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class fragment 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:539) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)   
    at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393) 
    at android.app.Activity.setContentView(Activity.java:2166) 
    at com.ui.MainActivity.onCreate(MainActivity.java:42) 
    at android.app.Activity.performCreate(Activity.java:6237)   
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java)    
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)  
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)  
    at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393)  
    at android.app.Activity.setContentView(Activity.java:2166)  
    at com.ui.MainActivity.onCreate(MainActivity.java:42)  
    at android.app.Activity.performCreate(Activity.java:6237)  
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)  
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)  
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
    at android.app.ActivityThread.-wrap11(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5417)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v17.leanback.widget.VerticalGridPresenter$ViewHolder android.support.v17.leanback.widget.VerticalGridPresenter.onCreateViewHolder(android.view.ViewGroup)' on a null object reference 
    at android.support.v17.leanback.app.VerticalGridFragment.onViewCreated(VerticalGridFragment.java:170) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:954) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126) 
    at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1228) 
    at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2201) 
    at android.app.FragmentController.onCreateView(FragmentController.java:98) 
    at android.app.Activity.onCreateView(Activity.java:5546) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:754) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
    at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393) 
    at android.app.Activity.setContentView(Activity.java:2166) 
    at com.ui.MainActivity.onCreate(MainActivity.java:42) 
    at android.app.Activity.performCreate(Activity.java:6237) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
    at android.app.ActivityThread.-wrap11(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148)  
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 

Basé sur la façon dont je manifesterai ma mise en page, je dois utiliser VerticalGridLayout, mais je ne suis pas sûr de savoir comment l'utiliser avec ErrorFragment.

Quelqu'un peut-il me diriger dans la bonne direction?

Merci!

+0

Somehitng n'est pas réglé et il est à l'origine d'un nul exception de pointeur dans android.support.v17.leanback.app.VerticalGridFragment.onViewCreated – W0rmH0le

Répondre

1

Si vous regardez avec attention le logcat, vous pouvez voir que le problème n'est pas lié à XML mais à une méthode appelée lors de l'inflation XML (probablement une méthode callBack).

erreur

Ainsi, l'erreur est possible ici:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v17.leanback.widget.VerticalGridPresenter$ViewHolder android.support.v17.leanback.widget.VerticalGridPresenter.onCreateViewHolder(android.view.ViewGroup)' on a null object reference 
    at android.support.v17.leanback.app.VerticalGridFragment.onViewCreated(VerticalGridFragment.java:170) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:954) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126) 
    at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1228)   

mGridPresenter est NULL

J'ai vérifié le code source de android.support.v17.leanback.app.VerticalGridFragmentHERE:

Vous pouvez confirmer cette méthode VerticalGridFragment.onViewCreated() appels VerticalGridPresenter.onCreateViewHolder()

@Override 
public void More ...onViewCreated(View view, Bundle savedInstanceState) { 
    ViewGroup gridDock = (ViewGroup) view.findViewById(R.id.browse_grid_dock); 
    mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock); 
    gridDock.addView(mGridViewHolder.view); 

    updateAdapter(); 
} 

Cependant, selon vous connecter, à ce moment-là, onCreateViewHolder est appelé dans une référence NULL

Ainsi, nous pouvons conclure que mGridPresenter est NULL

Comment réparer

Vérification code android.support.v17.leanback.app.VerticalGridFragment souce, vous pouvez voir que mGridPresenter est défini uniquement dans la méthode setGridPresenter().

public void setGridPresenter(VerticalGridPresenter gridPresenter) { 
    if (gridPresenter == null) { 
     throw new IllegalArgumentException("Grid presenter may not be null"); 
    } 
    mGridPresenter = gridPresenter; 
    ... 
} 

Alors, sans doute, vous devez appeler cette méthode avant d'utiliser le VerticalGridFragmet

Vérification cet exemple de Google (HERE), vous pouvez voir qu'ils appellent setGridPresenter(). Donc, peut-être, vous manquez cette étape.

private void setupFragment() { 
    VerticalGridPresenter gridPresenter = new VerticalGridPresenter(); 
    gridPresenter.setNumberOfColumns(NUM_COLUMNS); 
    setGridPresenter(gridPresenter); 
... 

Cela ne termine pas répondre à votre question ... Mais je pense que vous aider à trouver le chemin ...

Cordialement