0

Ich bin neu im Programmieren, ich habe eine Naviagation Schublade mit Fragmenten. Wenn ich mein Gerät rotiere, startet es "die App neu" oder ruft das Home-Fragment auf. Ich bin mir nicht sicher, wie ich das beheben könnte, da es mit super.onCreate (savedInstance) verwandt ist, aber nicht gefunden hat, wie es implementiert wird. Ich versuchte auch mit der onConfigurationChanged Methode auf meinem Manifest ohne Glück. Ich habe Code aus verschiedenen Tutorials kopiert, um meine App so arbeiten zu lassen, dass ich nicht sicher bin, ob der Code im Posting der sein sollte, den ich posten sollte. Vielen Dank.Orientierung startet meine App neu

public class MainActivity extends FragmentActivity { 


    private DrawerLayout mDrawerLayout; 
    ImageView home; 
    Fragment fragment = null; 
    TextView appname; 
    ExpandableListView expListView; 
    HashMap<String, List<String>> listDataChild; 
    ExpandableListAdapter listAdapter; 
    List<String> listDataHeader; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     String fontPath = "neue.ttf"; 
     setContentView(R.layout.activity_main); 
     home = (ImageView)findViewById(R.id.home); 
     home.setOnClickListener(homeOnclickListener); 
     appname = (TextView)findViewById(R.id.appname); 
     Typeface tf = Typeface.createFromAsset(this.getAssets(), fontPath); 
     appname.setTypeface(tf); 

     setUpDrawer(); 
    } 

    private void setUpDrawer() { 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerLayout.setScrimColor(getResources().getColor(android.R.color.transparent)); 
     mDrawerLayout.setDrawerListener(mDrawerListener); 
     expListView = (ExpandableListView) findViewById(R.id.lvExp); 
     prepareListData(); 
     listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); 
     expListView.setAdapter(listAdapter); 
     fragment = new Home(); 
     getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit(); 
     mDrawerLayout.closeDrawer(expListView); 

     expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 
           @Override 
           public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
            switch (groupPosition) { 
             case 0: 
              switch (childPosition) { 
               case 0: 
                fragment = new 1(); 
                break; 
               case 1: 
                fragment = new 2(); 
                break; 
               case 2: 
                fragment = new 3(); 
                break; 
          ... 
         } 
         break; 

        case 1: 
         switch (childPosition) { 
          case 0: 
           fragment = new 4(); 
           break; 
          ... 
          default: 
           break; 
         } 
         break; 

        ... 
       } 
       getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit(); 
       mDrawerLayout.closeDrawer(expListView); 
       return false; 
      } 
     }); 

    }... 
+0

In Ihrem Manifest-Datei Add 'android: configChanges = "Orientierung"' zu Ihrem Aktivitäts-Tag. Dies verhindert, dass die Aktivität bei einer Orientierungsänderung zerstört und neu erstellt wird. Erweitern Sie AppCompatActivity mit Ihrer Aktivität auch aus der Support-Bibliothek. Dies ist ein besserer Ansatz für die Abwärtskompatibilität und stellt sicher, dass das configeChanges-Tag funktioniert. – chRyNaN

+0

Danke, ich versuche es, aber es hat nicht funktioniert –

+0

Als Shadab Ansari die Antwort, die Antwort mir helfen viel, aber ich musste über andere Probleme gehen, endlich fand ich eine Lösung für das Rotationsproblem auf eine andere Weise, die meine App nicht abgestürzt ist, wenn Sie wollen sehen, dass es hier ist http://stackoverflow.com/questions/36900671/app-crashen-after-irotate-device-and-click-the-menu/36901929#36901929 –

Antwort

1

Bei der Gerätedrehung wird die Aktivität neu gestartet - dies ist das scheinbare Verhalten. Wenn Sie nicht möchten, dass Ihre Aktivität erneut erstellt wird, fügen Sie in Ihrer Datei android:configChanges="orientation" die Datei Manifest für diese Aktivität hinzu.

Ansonsten können Sie setUpDrawer() Aufruf verhindern, wenn Ihre Aktivität durch Überprüfung savedInstanceState wie diese neu gestartet wird -

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     String fontPath = "neue.ttf"; 
     setContentView(R.layout.activity_main); 
     home = (ImageView)findViewById(R.id.home); 
     home.setOnClickListener(homeOnclickListener); 
     appname = (TextView)findViewById(R.id.appname); 
     Typeface tf = Typeface.createFromAsset(this.getAssets(), fontPath); 
     appname.setTypeface(tf); 

     if(savedInstanceState == null){ 
      setUpDrawer(); 
     } 
    } 
+0

Vielen Dank !!! das android: configChanges = "orientation" funktionierte nicht, aber das if (savedInstanceState == null) { setUpDrawer(); } tat es –

+0

Jetzt stürzt die App, nachdem ich gedreht habe und ich versuche, das Menü zu öffnen. Fehler .MainActivity $ 2.onClick (MainActivity.java:140) View.OnClickListener homeOnclickListener = new View.OnClickListener() { @Override public void onClick (Blick v) { if (mDrawerLayout.isDrawerOpen (expListView)) { mDrawerLayout.closeDrawer (expListView); } sonst { mDrawerLayout.openDrawer (expListView); } } }; –

+0

Sie sollten alle Ihre Ansichten außerhalb initialisieren, wenn Sie diese Ansichten blockieren, die sich in 'setUpDrawer()' befinden. Entfernen Sie die Sichteninitialisierung von 'setUpDrawer()'. –

Verwandte Themen