Fragmente und Orientierung ändern sich

Was ist der richtige Weg, um eine Orientierungsänderung bei der Verwendung von Fragmenten zu behandeln?

Ich habe ein Landschaftslayout, das 2 Fragmente enthält (instanziiert in Code in FrameLayout s). Wenn ich in den Portrait-Modus FrameLayout (dessen Layout nur ein FrameLayout enthält, das nur das linke Fenster enthält), ist das rechte Fragment nicht mehr erforderlich.

  • Wie implementiere ich Folie, um Aktionen in recyclerview zu zeigen?
  • Holen Sie sich Listenansicht Position Position auf Knopf klicken
  • Wie erstelle ich das Fragment der Aktivität aus dem Fragment selbst?
  • Ist es verfügbar, checkSelfPermission auf Minimum SDK <23 einzustellen?
  • Circle Pager Indikator schaut nicht um
  • Speichern einer Bitmap auf Festplatte / Galerie in Android 4.3
  • Ich erhalte einen Fehler:

     E/AndroidRuntime(4519): Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f060085 for fragment myFragment{418a2200 #2 id=0x7f060085} 

    Die davon ausgeht, dass meine Tätigkeit versucht, das Fragment wieder zu befestigen, wo es war, bevor die Orientierung sich ändert, aber da die Ansicht, die das Fragment enthält, im Hochformat nicht existiert, wird der Fehler geworfen.

    Ich habe versucht, die folgenden hide / entfernen / detach Methoden, aber immer noch den Fehler. Was ist der richtige Weg, um ein Fragment zu erzählen, dass es nicht mehr benötigt wird und nicht versuchen zu zeigen?

     @Override public void onCreate(Bundle b) { super.onCreate(b); Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragholder2); //rightPane is a framelayout that holds my fragment. if (rightPane == null && f != null) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.hide(f); // This doesnt work ft.remove(f); // neither does this ft.detach(f); // or this ft.commit; } } 

  • Brauchen Sie Zeit in einem 24-Stunden-Format beim Hinzufügen von Zeit
  • Suchansicht verwendet App-Symbol anstelle von Logo
  • Android Offline Anfrage mit Volley
  • Starten Sie Android Market von App
  • GIF-Datei mit Glide anzeigen (Bildlade- und Caching-Bibliothek)
  • Google Maps und Koordinatorlayout
  • 7 Solutions collect form web for “Fragmente und Orientierung ändern sich”

    Ich lief in das gleiche Problem und ich glaube, ich habe eine andere Lösung herausgefunden. Diese Lösung kann besser sein, weil du das Fragment nicht dem Rückenstapel hinzufügen musst.

    Entfernen Sie das rechte Fragment von Ihrer Aktivität in Activity.onSaveInstanceState() bevor Sie super.onSaveInstanceState() aufrufen. Das funktioniert für mich:

     public MyActivity extends Activity { @Override public onCreate(Bundle state) { super.onCreate(state); // Set content view setContentView(R.layout.my_activity); // Store whether this is a dual pane layout mDualPane = findViewById(R.id.rightFragHolder) != null; // Other stuff, populate the left fragment, etc. . . . if (mDualPane) { mRightFragment = new RightFragment(); FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.rightFragHolder, mRightFragment); ft.commit() } } @Override public void onSaveInstanceState(Bundle state) { if (mDualPane) { FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.remove(mRightFragment); ft.commit() } super.onSaveInstanceState(state); } private boolean mDualPane; private Fragment mRightFragment; } 

    Wenn Sie das Fragment behalten, versuchen Sie es nicht zu behalten.

     setRetainInstance(false) 

    Anstatt von

     setRetainInstance(true) 

    Ich glaube, ich habe es gelöst.

    Ich fügte das Fragment zum hinteren Stapel hinzu und dann, bevor die Aktivität schließt, tauchte es wieder ab, was effektiv davon los ist. Scheint so weit zu arbeiten.

    Normalerweise haben Sie zwei Fragmente (links / rechts), eine Hauptaktivität und eine Containeraktivität für das richtige Fragment (nur bei Telefongeräten). Dies ist in diesem Blog-Eintrag beschrieben: Die Android 3.0 Fragments API

     public class MyActivity extends FragmentActivity implements MyListFragment.MyContextItemSelectedListener { @Override public void onCreate(final Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.activity); } // Callback from ListFragment @Override public void myContextItemSelected(final int action, final long id) { if (action == R.id.men_show) { processShow(id); } } private void processShow(final long id) { if (Tools.isXlargeLand(getApplicationContext())) { Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.right); if (fragment == null || fragment instanceof MyEditFragment || (fragment instanceof MyShowFragment && ((MyShowFragment) fragment).getCurrentId() != id)) { fragment = new MyShowFragment(id); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.right, fragment); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); transaction.commit(); } } else { Intent intent = new Intent(); intent.setClass(this, MyShowActivity.class); intent.putExtra("ID", id); startActivityForResult(intent, MyConstants.DLG_TABLE1SHOW); } } private static boolean isXlargeLand(final Context context) { Configuration configuration = context.getResources().getConfiguration(); return (((configuration.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) && configuration.orientation == Configuration.ORIENTATION_LANDSCAPE); } } 

    Wenn Sie eine Zwei-Scheiben-Aktivität mit einem linken und rechten Fenster haben und eine der Scheiben (normalerweise das rechte Fenster) vermutet, dass sie nicht angezeigt wird, wenn das Gerät in den Hochformat-Modus wechselt, lassen Sie Android seine Sache und erstellen Sie das rechte Fenster. Aber während der onCreateView des rechten Bereichs, das erste, was Sie tun sollten, ist zu überprüfen, ob eines der Layout-Elemente, die von der Scheibe verwendet werden, sogar verfügbar ist. Wenn dies nicht der Fall ist, entfernen Sie das Fragment mit dem FragmentManager und kehren Sie sofort zurück:

     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View myView = getActivity().findViewById(R.id.myView); if (myView == null) { FragmentTransaction fragTransaction = getFragmentManager().beginTransaction(); fragTransaction.remove(this); fragTransaction.commit(); return null; } } 

    Android erstellt beide Fragmente während der Bildschirmdrehung. Aber wenn du den Check unten in onCreateView () hinzufügst, wird es dich vor Problemen verhindern:

      @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (container == null) { // Currently in a layout without a container, so no // reason to create our view. return null; } // inflate view and do other stuff } 

    Ich habe diese von Android Developers Blog .

    Sie brauchen diese Aktivität nicht mehr, weil das Fragment inline angezeigt wird. So können Sie die Aktivität beenden

     protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // we are in landscape so you do not need this activity anymore finish(); return; } if (savedInstanceState == null) { // plugin right pane fragment YourFragment frgm = new YourFragment(); getSupportFragmentManager().beginTransaction() .add(..., frgm).commit(); } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.