2016-07-01 7 views
1

Ich habe viele Fragen in Bezug auf Binary XML file line #2: Binary XML file line #2: Error inflating class fragment gesehen, aber keiner von ihnen ist mit mir verwandt und sogar einige der Lösungen zu versuchen, hat nicht funktioniert.Android: VerticalGridFragment führt zum Absturz der App, wenn ErrorFragment verwendet wird?

Mein Problem ist, dass wenn ich einen VerticalGridFragment benutze und ich einen ErrorFragment präsentiere, stürzt es ab. Wenn ich jedoch meine MainFragment auf DetailsFragment verwende, stürzt die App nicht ab und ich kann die ErrorFragment verwenden.

Hier ist mein Beispielcode:

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) 
      { 

      } 
     }); 
    } 

    ... 
} 

Mein 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) 

Basierend auf, wie ich mein Layout angezeigt werden, ich brauche VerticalGridLayout zu verwenden, aber ich bin nicht sicher, wie es zu benutzen mit ErrorFragment.

Kann mir jemand in die richtige Richtung zeigen?

Danke!

+0

Somehitng nicht gesetzt ist und es verursacht eine Null Zeigerausnahme in android.support.v17.leanback.app.VerticalGridFragment.onViewCreated – W0rmH0le

Antwort

1

Wenn Sie mit Vorsicht das Logcat betrachten, können Sie sehen, dass dieses Problem nicht mit XML in Verbindung steht, sondern mit einer Methode, die während der XML-Inflation aufgerufen wird (wahrscheinlich eine CallBack-Methode).

ERROR

So ist Fehler möglich:

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 NULL ist

ich den Quellcode von android.support.v17.leanback.app.VerticalGridFragmentHERE geprüft:

Sie können bestätigen, diese Methode VerticalGridFragment.onViewCreated() Anrufe 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(); 
} 

Doch nach einzuloggen, zu diesem Zeitpunkt, onCreateViewHolder in einer NULL Referenz

So genannt wird, können wir schließen, dass mGridPresenter ist NULL

Wie zu beheben

Überprüfung android.support.v17.leanback.app.VerticalGridFragment Souce-Code, können Sie sehen, dass mGridPresenter wird nur in Methode setGridPresenter() festgelegt.

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

also wahrscheinlich, müssen Sie, bevor diese Methode aufrufen, die Verwendung VerticalGridFragmet

Überprüfen Sie dieses Beispiel von Google (HERE), können Sie sehen, dass sie setGridPresenter() nennen. Vielleicht vermisst du diesen Schritt.

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

Diese vervollständigen Ihre Frage nicht beantworten ... Aber ich denke, dass es Ihnen den Weg zu finden, helfen ...

Grüße