1

我是一個非常新手與Android。我想創建一個3橫向頁面的活動。每個頁面都有一個網格視圖。我使用ViewPager創建頁面併爲每個頁面使用GridView。以下是密碼片段必須是升級後的公共靜態類崩潰錯誤在Android工作室回購v9

public class CategoryActivity extends ActionBarActivity { 

    static final int NUM_ITEMS = 3; 

    MyAdapter mAdapter; 

    ViewPager mPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_pager); 

     getSupportActionBar().hide(); 

     mAdapter = new MyAdapter(this.getSupportFragmentManager()); 

     mPager = (ViewPager)findViewById(R.id.pager); 
     mPager.setAdapter(mAdapter); 

    } 

    //MyAdapter is adapter for Pager 
    public class MyAdapter extends FragmentPagerAdapter { 

     ArrayList<ArrayListFragment> fragments; 
     public MyAdapter(FragmentManager fm) { 
      super(fm); 

      fragments = new ArrayList<>(); 

      for (int i = 0; i < NUM_ITEMS; i++) { 
       ArrayListFragment f = new ArrayListFragment(); 

       fragments.add(f); 
      } 
     } 

     @Override 
     public int getCount() { 
      return NUM_ITEMS; 
     } 

     @Override 
     public Fragment getItem(int position) { 

      //For each page -> get fragment for that page 
      ArrayListFragment f = fragments.get(position); 

      return f; 
     } 
    } 

    //Adapter for each grid view in each Page 
    public class ImageAdapter extends BaseAdapter { 
     private Context mContext; 
     private View parentView; 

     public ImageAdapter(Context c) { 
      mContext = c; 
     } 

     public ImageAdapter(Context c, View aParentView) { 
      mContext = c; 
      parentView = aParentView; 
     } 

     public int getCount() { 
      return mThumbIds.length; 
     } 

     public Object getItem(int position) { 
      return null; 
     } 

     public long getItemId(int position) { 
      return 0; 
     } 

     // create a new ImageView for each item referenced by the Adapter 
     public View getView(int position, View convertView, ViewGroup parent)  { 
      View itemView; 
      if (convertView == null) { 

       //I really config view for each item in grid view.... 
       //The problem is not here 
       //.......... 
      } 
      return itemView; 
     } 

     // references to our images 
     private Integer[] mThumbIds = { 
       R.drawable.images, R.drawable.images, 
       R.drawable.images, R.drawable.images, 
       R.drawable.images, R.drawable.images, 
       R.drawable.images, R.drawable.images, 
       R.drawable.images, R.drawable.images, 
       R.drawable.images, R.drawable.images 
     }; 
    } 

    public class ArrayListFragment extends Fragment { 

     /** 
     * When creating, retrieve this instance's number from its arguments. 
     */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
     } 

     /** 
     * The Fragment's UI is just a simple text view showing its 
     * instance number. 
     */ 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      final View v = inflater.inflate(R.layout.fragment_pager_list, container, false); 

      GridView gridview = (GridView) v.findViewById(R.id.categridview); 

      ImageAdapter ia = new ImageAdapter(CategoryActivity.this, gridview); 
      gridview.setAdapter(ia); 

      return v; 
     } 


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

     } 

    } 
} 

它在回購v7中效果很好。但經過我升級到回購V9,它與錯誤啓動後崩潰

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: <my project process>, PID: 1901 
        java.lang.IllegalStateException: Fragment <my project package>.CategoryActivity.ArrayListFragment must be a public static class to be properly recreated from instance state. 
         at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:435) 
         at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:426) 
         at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:103) 
         at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:1006) 
         at android.support.v4.view.ViewPager.populate(ViewPager.java:1154) 
         at android.support.v4.view.ViewPager.populate(ViewPager.java:1088) 
         at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1614) 
         at android.view.View.measure(View.java:18788) 
         at android.widget.LinearLayout.measureVertical(LinearLayout.java:901) 
         at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) 
         at android.view.View.measure(View.java:18788) 
         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
         at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
         at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 
         at android.view.View.measure(View.java:18788) 
         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
         at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:389) 
         at android.view.View.measure(View.java:18788) 
         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
         at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
         at android.view.View.measure(View.java:18788) 
         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
         at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) 
         at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) 
         at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) 
         at android.view.View.measure(View.java:18788) 
         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
         at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
         at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) 
         at android.view.View.measure(View.java:18788) 
         at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100) 
         at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216) 
         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452) 
         at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
         at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
         at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
         at android.view.Choreographer.doFrame(Choreographer.java:606) 
         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
         at android.os.Handler.handleCallback(Handler.java:739) 
         at android.os.Handler.dispatchMessage(Handler.java:95) 
         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) 
I/Process: Sending signal. PID: 1901 SIG: 9 
Application terminated. 

我四處搜尋了兩天,但找不到任何幫助,以解決它 ,有人在

一個非常類似的問題Android IllegalStateException: Fragment null must be a public static class to be properly recreated from instance state

Fragment must be a public static class to be properly recreated from instance state

爲什麼ArrayListFragment畝T爲一個公共靜態類,我想每個人都必須有一個獨立的片段

有什麼問題就在這裏,任何人都可以幫我找出

回答

1

是ArrayListFragment在同一個Java文件作爲CategoryActivity?如果它是真的,靜態類意味着可以創建ArrayListFragment的一個實例,而無需創建一個CategoryActivity的實例。所以每個類都可以擁有自己的ArrayListFragment實例。

+0

是的,所有的都在一個java文件中。但我不太明白,你能更清楚地解釋一下。我應該做什麼? 順便說一下,我從另一個活動創建了一個CategoryActivity的實例,只是爲CategoryActivity創建一個Intent並啓動它,沒什麼特別的。並且類CategoryActivity中的所有代碼都顯示在上面,沒有更多 –

+0

當然。閱讀關於java中的嵌套類以及它們的實例化規則。您應該爲ArrayListFragment(和其他片段)創建單獨的java文件,或者將您的嵌套片段類聲明爲靜態。 這裏有一些有用的鏈接: https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html http://stackoverflow.com/questions/15571010/fragment-inner-class-should-be -static –

+0

感謝Viktor Dolgalyov,我將ArrayListFragment移動到另一個Java文件並且工作正常。我應該多讀些關於它 –

相關問題