Narrensicherer Weg, Fragment bei Orientierungsänderung zu handhaben

Lesezeit: 4 Minuten

Narrensicherer Weg Fragment bei Orientierungsanderung zu handhaben
Benutzer1811741

public class MainActivity extends Activity implements MainMenuFragment.OnMainMenuItemSelectedListener {

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();

    // add menu fragment
    MainMenuFragment myFragment = new MainMenuFragment();
    fragmentTransaction.add(R.id.menu_fragment, myFragment);

    //add content
    DetailPart1 content1= new DetailPart1 ();
    fragmentTransaction.add(R.id.content_fragment, content1);
    fragmentTransaction.commit();

}
public void onMainMenuSelected(String tag) {
  //next menu is selected replace existing fragment
}

Ich muss zwei Listenansichten nebeneinander anzeigen, das Menü links und den Inhalt rechts. Standardmäßig ist das erste Menü ausgewählt und sein Inhalt wird auf der rechten Seite angezeigt. Das Fragment, das den Inhalt anzeigt, ist wie folgt:

public class DetailPart1 extends Fragment {
  ArrayList<HashMap<String, String>> myList = new ArrayList<HashMap<String, String>>();
  ListAdapter adap;
  ListView listview;

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

       if(savedInstanceState!=null){
        myList = (ArrayList)savedInstanceState.getSerializable("MYLIST_obj");
        adap = new LoadImageFromArrayListAdapter(getActivity(),myList );
        listview.setAdapter(adap);
       }else{
        //get list and load in list view
        getlistTask = new GetALLListTasks().execute();
    }


     @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.skyview_fragment, container,false);
           return v;
        }


     @Override
      public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
          outState.putSerializable("MYLIST_obj", myList );
        }
    }

Die onActivityCreated und onCreateView werden aufgerufen zweimal. Es gibt viele Beispiele, die Fragmente verwenden. Da ich Anfänger in diesem Thema bin, kann ich das Beispiel nicht mit meinem Problem in Verbindung bringen. Ich brauche einen narrensicheren Weg, um mit Orientierungsänderungen umzugehen. Ich habe NICHT deklariert android:configChanges in der Manifestdatei. Ich brauche die Aktivität zerstören und neu erstellen, damit ich im Querformat ein anderes Layout verwenden kann.

  • Normalerweise werden Orientierungsänderungen von Fragmenten erledigt, ohne dass Sie etwas tun müssen. Was ist also das Problem, das Sie haben, wenn Sie die Ausrichtung ändern?

    – Alexander Kulachtin

    9. November 12 um 10:11 Uhr

  • Alex Ich brauche das Fragment der Klasse DetailPart1, um das Layout mit listView im Hochformat und das Layout mit Grid View im Querformat anzuzeigen. Dazu muss ich das Fragment jedes Mal neu erstellen, aber ich möchte nicht die gleichen Datensätze erneut laden, also i Speichern Sie sie unter onSaveInstanceState. Aber der obige Code erstellt DetailPart1 zweimal neu, ich muss den fehlenden Code kennen, der es wie gewünscht funktionieren lässt

    – Benutzer1811741

    9. November 12 um 18:49 Uhr

  • mögliches Duplikat des Lebenszyklus von Android-Fragmenten über Ausrichtungsänderungen

    – NaXa

    18. Dezember 14 um 14:24 Uhr

1643910787 223 Narrensicherer Weg Fragment bei Orientierungsanderung zu handhaben
Warpzit

Jedes Mal, wenn Sie den Bildschirm in Ihrer Aktivität drehen, erstellen Sie ein neues Fragment onCreate(); Aber Sie pflegen auch die alten mit super.onCreate(savedInstanceState);. Setzen Sie also vielleicht das Tag und finden Sie das Fragment, falls vorhanden, oder übergeben Sie das Null-Bundle an super.

Ich habe eine Weile gebraucht, um das zu lernen, und es kann wirklich mühsam sein, wenn Sie mit Dingen wie Viewpager arbeiten.

Ich würde Ihnen empfehlen, darüber zu lesen Fragmente eine zusätzliche Zeit, da genau dieses Thema behandelt wird.

Hier ist ein Beispiel für den Umgang mit Fragmenten bei einem regelmäßigen Orientierungswechsel:

Aktivität:

public class MainActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        if (savedInstanceState == null) {
            TestFragment test = new TestFragment();
            test.setArguments(getIntent().getExtras());
            getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit();
        } else {
            TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag");
        }
    }
}

Fragment:

public class TestFragment extends Fragment {

    public static final String KEY_ITEM = "unique_key";
    public static final String KEY_INDEX = "index_key";
    private String mTime;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_layout, container, false);
        
        if (savedInstanceState != null) {
            // Restore last state
            mTime = savedInstanceState.getString("time_key");
        } else {
            mTime = "" + Calendar.getInstance().getTimeInMillis();
        }
        
        TextView title = (TextView) view.findViewById(R.id.fragment_test);
        title.setText(mTime);
        
        return view;
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("time_key", mTime);
    }
}

  • danke Warpzit für deine Mühe, aber ich würde mich freuen, wenn du deinen Punkt im Code erklärst.

    – Benutzer1811741

    9. November 12 um 17:45 Uhr

  • Daher muss das Layout des Fragments in Bezug auf die Ausrichtung geändert werden, aber ich möchte nicht alle Datensätze neu laden. Was ich getan habe, war 1. Hinzufügen von android:configchanges=”Orientation” in Manifest 2. Überschreiben von onConfigurationChanged in Fragment und Erkennen der Ausrichtung und Listenansicht oder Gitteransicht je nach Ausrichtung ausblenden / anzeigen. Ist dies der richtige Weg?

    – Benutzer1811741

    10. November 12 um 6:17 Uhr

  • @ user1811741 mit Beispiel aktualisiert. Ich hoffe es klärt alles auf.

    – Warpzit

    10. November 12 um 12:15 Uhr

  • @Warpzit Wie kann das gleiche Szenario bei der Implementierung von ViewPager-Fragmenten behandelt werden, da ViewPager sich um alle angezeigten Fragmente kümmert … jeden Vorschlag.

    – Code

    30. Dezember 14 um 12:47 Uhr

  • @Shubh Nun, ich glaube, Viewpager handhabt das richtig, wenn nicht, müssen Sie die getItem-Implementierung überschreiben, um sie an Ihre Bedürfnisse anzupassen. Ich hoffe, das hat Sie in die richtige Richtung gelenkt, wenn nicht, stellen Sie eine richtige Frage 🙂

    – Warpzit

    2. Januar 15 um 9:22 Uhr

Narrensicherer Weg Fragment bei Orientierungsanderung zu handhaben
Sergej Werfel

Eine gute Richtlinie darüber, wie Daten zwischen Orientierungsänderungen und Aktivitätserholung gespeichert werden können, kann gefunden werden in Android-Richtlinien.

Zusammenfassung:

  1. Machen Sie Ihr Fragment haltbar:

    setRetainInstance(true);
    
  2. Nur bei Bedarf ein neues Fragment erstellen (oder zumindest Daten daraus entnehmen)

    dataFragment = (DataFragment) fm.findFragmentByTag("data");
    
    // create the fragment and data the first time
    if (dataFragment == null) {
    

  • nett Spare meine Zeit wah

    – Arjun saini

    13. April 20 um 8:33 Uhr

.

758310cookie-checkNarrensicherer Weg, Fragment bei Orientierungsänderung zu handhaben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy