2015-08-26 1 views
1

J'utilise des onglets coulissants dans mon application et j'ai 2 fragments avec un pager de vue. À l'intérieur d'un fragment, il y a aussi une vue recycleur.Android: fragments avec l'erreur de changement d'orientation RecyclerView

Catégories fragmenter

public class Categories extends Fragment{ 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    if (cat == null) { 
     cat = inflater.inflate(R.layout.categories, container, false); 
    } else { 
     ((ViewGroup) cat.getParent()).removeAllViews(); 
    } 
    catData = new ArrayList<>(); 

    if(mRecyclerView == null) { 
     mRecyclerView = (RecyclerView) cat.findViewById(R.id.recyclerView); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
    }else{ 
     ((ViewGroup) mRecyclerView.getParent()).removeAllViews(); 
    } 
    return mRecyclerView; 

} 

Handler handler = new Handler(); 

Runnable mStatusChecker = new Runnable() { 
    @Override 
    public void run() { 
     GetCategoriesTask access = new GetCategoriesTask(); 
     access.execute(); 
     //this function can change value of mInterval. 
     handler.postDelayed(mStatusChecker, 10000); 
    } 
}; 


private class GetCategoriesTask extends AsyncTask<Void, Void, ArrayList<CategoryData>> { 

    @Override 
    protected void onPreExecute() { 

    } 

    //task is running in background 
    @Override 
    protected ArrayList<CategoryData> doInBackground(Void... arg0) { 

     ServiceHandler sh = new ServiceHandler(); 
     String baseAddress = "url"; 
     String jsonStr = sh.makeServiceCall(ServiceHandler.GET,baseAddress); 

     if(jsonStr != null){ 
      try{ 
       JSONObject jsonObj = new JSONObject(jsonStr); 
       JSONArray data = jsonObj.getJSONArray("data"); 

       catData.clear(); 
       for(int i = 0;i < data.length();i++){ 
        JSONObject c = data.getJSONObject(i); 
        String categoryName = c.getString("category"); 

        catData.add(new CategoryData(categoryName)); 
       } 
       return catData; 

      }catch (JSONException ex){ 
       ex.printStackTrace(); 
      } 
     } 

     Log.d("Response: ", "> " + jsonStr); 
     return null; 
    } 

    //after executing background task, this method will execute. 
    @Override 
    protected void onPostExecute(ArrayList<CategoryData> data) { 

     if(!notifier) { 
      adapter = new CategoryRecyclerViewAdapter(getContext(), data); 
      mRecyclerView.setAdapter(adapter); 
      notifier = true; 
     } 
     else{     
       adapter.notifyDataSetChanged(); 
       Toast.makeText(getContext(), "changed", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

@Override 
public void onResume() { 
    super.onResume();  
    mStatusChecker.run(); 

} 
@Override 
public void onSaveInstanceState(final Bundle outState) { 
    // super.onSaveInstanceState(outState); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    handler.removeCallbacks(mStatusChecker); 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    handler.removeCallbacks(mStatusChecker); 

} 
@Override 
public void onStop() { 
    super.onStop();   
    handler.removeCallbacks(mStatusChecker); 
}} 

Découvrez Fragment

Je n'ai que la méthode oncreate.

public class Discover extends Fragment{ 

public View v; 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    if (v == null) { 
     v = inflater.inflate(R.layout.categories, container, false); 
    } else { 
     ((ViewGroup) v.getParent()).removeAllViews(); 
    } 
    return v; 
} 

Le problème est quand je change l'orientation de l'application donne une exception et affiche le message « malheureusement ezycity a arrêté » .Lorsque je clique sur l'application bouton ok redémarre à nouveau et travailler normalement.

logcat

08-26 10:17:25.954 4452-4452/com.ezycity.seneru.ezycity E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.ezycity.seneru.ezycity, PID: 4452 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ezycity.seneru.ezycity/com.ezycity.seneru.ezycity.MainActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3950) 
     at android.app.ActivityThread.access$900(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5257) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
     at android.view.ViewGroup.addViewInner(ViewGroup.java:3936) 
     at android.view.ViewGroup.addView(ViewGroup.java:3786) 
     at android.support.v4.view.ViewPager.addView(ViewPager.java:1342) 
     at android.view.ViewGroup.addView(ViewGroup.java:3727) 
     at android.view.ViewGroup.addView(ViewGroup.java:3700) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1197) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1179) 
     at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1991) 
     at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:165) 
     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:507) 
     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236) 
     at android.app.Activity.performStart(Activity.java:6006) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288) 

Alors, comment je résoudre ce problème?

+0

ce qui paramètre à votre activité dans le fichier manifeste? – Vigor

+0

J'ai ce code dans mon manifeste – udi

+0

android: configChanges = "keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize | mcc | mnc" – udi

Répondre

1

permet donc jeter un oeil à ce morceau de code:

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    if (cat == null) { 
     cat = inflater.inflate(R.layout.categories, container, false); 
    } else { 
     ( (ViewGroup) cat.getParent()).removeAllViews(); 
    } 
    catData = new ArrayList<>(); 

    if(mRecyclerView == null) { 
     mRecyclerView = (RecyclerView) cat.findViewById(R.id.recyclerView); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 
    }else{ 
     ((ViewGroup) mRecyclerView.getParent()).removeAllViews(); 
    } 
    return mRecyclerView; 

} 

Au début, vous gonflez cat qui n'attatched à la racine, en raison du dernier paramètre. C'est correct Puis vous recherchez mRecyclerView dans cat. Cela signifie également que le parent de mRecyclerView est chat.

Après cela, vous renvoyez mRecyclerView. Le pager essaie donc d'ajouter mRecyclerView à une page, mais mRecyclerView a déjà un parent (chat).


donc la solution pour ce fragment pourrait être:

au lieu de:

return mRecyclerView; 

utilisation:

return cat; 
+0

Hey merci pour votre soutien. J'ai compris ce qui s'est mal passé. C'était un problème dans ma mise en page.Tout moyen d'essayer d'aider. :) – udi