2012-12-14 10 views
11

Mam do czynienia z następującym problemem: Na głównym ekranie mam 3 przyciski: Config, Main, Setting.Viewpager w fragmencie nie jest wyświetlany (przywracany) po powrocie z innego fragmentu.

  • Po kliknięciu każdego przycisku pojawi się odpowiedni fragment, aby nadmuchać układ w FrameLayout.
  • Gdy użytkownik znajduje się w Config lub Setting Fragment, może wrócić do głównego Fragmentu za pomocą onBackpressed lub kliknąć przycisk Main. Gdy użytkownik znajduje się w głównym fragmencie, jeśli użytkownik kliknie przycisk Wstecz, pojawi się wyskakujące okienko potwierdzające wyjście.

W głównym Fragmentie umieszczam widok strony. Wewnątrz tego podglądu umieszczam 2 inne fragmenty, z których każdy zawiera siatkę obrazów (użyłem również wskaźnika okręgu, aby zobaczyć zmiany strony na dole). Dla uproszczenia fragmenty konfiguracji i fragment fragmentu pokazują tylko tekst w środku. Po uruchomieniu aplikacji w normalnym widoku główny fragment, po kliknięciu przycisku Ustawienia lub Konfiguracja, pokazywał zwykle odpowiadające fragmenty. Problem polega na tym, że po kliknięciu przycisku Wstecz (na Androidzie) wraca on do głównego fragmentu, ale bez fragmentów wewnątrz podglądu. Pokazał pusty ekran.

Main fragment- fragment 1 in viewpager is shown Main fragment - fragment 2 in viewpager is shown Config fragment Setting fragment Go back to main fragment from config/setting fragment

Może się mylę, gdy proces wraca z config/ustawienia fragmentu do głównego fragmentu. Jeśli główny fragment po prostu nadmuchuje określony układ bez podglądacza, problem nie nastąpi. Jak przywrócić stan podglądu po powrocie do głównego fragmentu z fragmentu config/setting? Załączam mój kod, abyś mógł dać mi bardziej jasną odpowiedź. Dziękuję bardzo za odpowiedź.

package com.example.testfragmentviewpager; 

import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.FrameLayout; 

import com.example.viewpageindicator.CirclePageIndicator; 
import com.example.viewpageindicator.PageIndicator; 

public class MainActivity extends FragmentActivity { 

    Fragment configFragment; 
    Fragment settingFragment; 
    Fragment mainItemsFragment; 
    FrameLayout frmLayout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

     setContentView(R.layout.main); 

     if (savedInstanceState == null) { 
      FragmentManager fm = getSupportFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 
      frmLayout = (FrameLayout) findViewById(R.id.frame_cotainer); 
      mainItemsFragment = new MainItemsFragment(); 
      ft.add(R.id.frame_cotainer, mainItemsFragment, "mainItems").commit(); 
     } 

     addListener(R.id.btnConfig); 
     addListener(R.id.btnMain); 
     addListener(R.id.btnSetting); 

    } 

    public void addListener(int buttonID) { 
     final Button btn = (Button) findViewById(buttonID); 
     btn.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       showFragment(btn); 
      } 
     }); 
    } 

    public void showFragment(View v) { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     switch (v.getId()) { 
      case R.id.btnConfig: 
       if (configFragment == null) { 
        configFragment = new ConfigListFragment(); 
       } 
       else if (configFragment.isVisible()) 
        return; 
       if (getCurrentEntriesInBackStack() == 0) { 
        ft.addToBackStack("mainItems"); 
       } 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       ft.replace(R.id.frame_cotainer, configFragment, "config"); 

       break; 
      case R.id.btnMain: 
       if (mainItemsFragment == null) 
        mainItemsFragment = new MainItemsFragment(); 
       if (getCurrentEntriesInBackStack() == 0) 
        return; 
       else { 
        if (configFragment != null && configFragment.isVisible()) { 
         ft.detach(configFragment); 
         configFragment = null; 
        } 
        if (settingFragment != null && settingFragment.isVisible()) { 
         ft.detach(settingFragment); 
         settingFragment = null; 
        } 
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        removeFromContainer(ft); 
        callPopBackStack(); 
        return; 
       } 
      case R.id.btnSetting: 
       if (settingFragment == null) 
        settingFragment = new SettingFragment(); 
       else if (settingFragment.isVisible()) 
        return; 
       if (getCurrentEntriesInBackStack() == 0) { 
        ft.addToBackStack("mainItems"); 
       } 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       ft.replace(R.id.frame_cotainer, settingFragment, "setting"); 
       break; 
      default: 
       break; 
     } 

     ft.commit(); 
    } 

    private int getCurrentEntriesInBackStack() { 
     FragmentManager fm = getSupportFragmentManager(); 
     return fm.getBackStackEntryCount(); 
    } 

    private boolean callPopBackStack() { 
     FragmentManager fm = getSupportFragmentManager(); 

     boolean result = fm.popBackStackImmediate(); 
     return result; 
    } 

    private void removeFromContainer(FragmentTransaction ft) { 
     if (configFragment != null && configFragment.isVisible()) { 
      ft.detach(configFragment); 
      configFragment = null; 
     } 
     if (settingFragment != null && settingFragment.isVisible()) { 
      ft.detach(settingFragment); 
      settingFragment = null; 
     } 
     ft.commit(); 
    } 

    public static class ConfigListFragment extends Fragment { 

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

    public static class SettingFragment extends Fragment { 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View v = inflater.inflate(R.layout.layout_setting, container, false); 
      return v; 
     } 

    } 

    public static class MainItemsFragment extends Fragment { 

     private MyPagerAdapter adapter; 
     private ViewPager viewpager; 
     private PageIndicator mIndicator; 
     View rootView; 

     private class setAdapterTask extends AsyncTask<Void, Void, Void> { 
      protected Void doInBackground(Void... params) { 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       viewpager.setAdapter(adapter); 
       mIndicator = (CirclePageIndicator) rootView.findViewById(R.id.indicator); 
       mIndicator.setViewPager(viewpager); 

       viewpager.setCurrentItem(0); 

      } 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      rootView = inflater.inflate(R.layout.mainscreen_layout, container, false); 

      adapter = new MyPagerAdapter(getFragmentManager()); 
      viewpager = (ViewPager) rootView.findViewById(R.id.myviewpager); 
      new setAdapterTask().execute(); 
      return rootView; 
     } 

    } 

    public static class MyPagerAdapter extends FragmentPagerAdapter { 

     public MyPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int index) { 
      if (index == 0) { 
       return new MainFragment1(); 
      } 
      else { 
       return new MainFragment2(); 
      } 
     } 

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

    @Override 
    public void onBackPressed() { 

     FragmentManager fm = getSupportFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     removeFromContainer(ft); 
     if (fm.popBackStackImmediate()) { 
      return; 
     } 

     else { 

      AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this); 
      dlg.setTitle("Confirm Exit"); 
      dlg.setMessage("Do you want to exit?").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        MainActivity.this.finish(); 
       } 

      }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 

      AlertDialog alertDlg = dlg.create(); 
      alertDlg.show(); 
     } 
    } 

} 

Odpowiedz

16

Wygląda na to, że używasz jednego ze starych hacków do osadzania fragmentów. Proponuję najpierw uaktualnić do najnowszej biblioteki pomocy Androida, np. Wersja 11. Następnie zobacz, jak korzystać z komponentu Child FragmentManager http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager()

Mam przykład na githubie, jak zagnieżdżać fragmenty za pomocą narzędzia ViewPager.

+3

Dzięki Marco za Twoją sugestię. Właśnie zaktualizowałem bibliotekę pomocy technicznej Androida do wersji Re. 11 i przekazuj getChildFragmentManager() do konstruktora viewpagera, ale wciąż nie ma szczęścia. Kiedy wracam z fragmentu Setting/Config, widok w głównym Fragmentie jest nadal pusty. Proces, w którym użytkownik wraca z fragmentu ustawienia/konfiguracji, zaimplementowałem go w następujący sposób (zobacz szczegóły w funkcji showFragment kodu wbudowanego): 1/Odłącz UI fragmentu ustawień/config; 2/zdobądź główny fragment z tylnego stosu Czy się mylę, gdy otrzymuję główny Fragment z tylnego stosu? – zungnv

+0

To działa dla mnie, głosuj w górę :) –

+0

Pracowałem dla mnie! Dziękuje! – NemesisDoom

Powiązane problemy