2013-10-28 32 views
5

StackOverflow'ta bu iletilerin bir tonunu buldum. Diğer birçok insan gibi sekmeleri değiştirirken üst üste gelen içeriklerle de aynı problemi yaşadım. Bulduğum tavsiyelerin hiçbiri benim sorunumla çalışmadı.ActionBar sekmesi içeriği üst üste biniyor

Uygulamam başladığında, ilk sekmenin içeriğini doğru şekilde gösterir. Diğer sekmeyi tıkladığımda, eski içerikler ekranda kalır ve diğer sekmenin içeriği de ekrana eklenir. Sekmeleri ikinci kez değiştirirken, tüm içerikler kaybolur. Anahtarlama sekmeleri artık herhangi bir işlem yapmaz.

Google'ın Geliştirici dokümanını here takip ettim.

başvurum bu onCreate yöntemi vardır .. sınıf android.support.v7.app kitaplığındaki desteğinden ActionBarActivity uzanır.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    actionBar.setDisplayShowTitleEnabled(false); 

    Tab tab = actionBar.newTab().setText("TAB1").setTabListener(new TabListener<Tab1Class>(this, "tab1", Tab1Class.class)); 
    actionBar.addTab(tab); 

    tab = actionBar.newTab().setText("TAB2").setTabListener(new TabListener<Tab2Class>(this, "tab2", Tab2Class.class)); 
    actionBar.addTab(tab); 
} 

Benim TabListener sınıf I bağlantılı sayfadan kopyalanır:

public class TabListener<T extends Fragment> implements ActionBar.TabListener { 
    private Fragment mFragment; 
    private final Activity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 

    public TabListener(Activity activity, String tag, Class<T> clz) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     if(mFragment == null) { 
      mFragment = Fragment.instantiate(mActivity, mClass.getName()); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } else { 
      ft.attach(mFragment); 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if(mFragment != null) { 
      ft.detach(mFragment); 
     } 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) {} 
} 

Ben sekmelerin içeriğini olarak kullanmak Hem sınıflar android.support.v4.app.Fragment den Fragment uzanır. Düzenlerini onCreateView yöntemlerinde şişiriyorlar.

Neyin var?

cevap

7

Neyin var? ActionBarActivity için kod hızlıca göz sonra

, ayrıca ilgilenir ICS için ve (önceden ICS cihazlar için çalışması gerektiğini kod) ActionBar uygulanmasının bir parçası üzerinde bir hata var gibi görünüyor sekmeler. o (işlem diğer iki geri aramalar için kararlıdır dinleyicinin geri arama döndükten sonra herhangi bir yerde işlenen değil, ancak dünyanın onTabUnselected() callback'inde geçirilen FragmentTransaction görünüyor ICS cihazlar için uygulama temsil ActionBarImplICS sınıfında

tamamen yararsız olduğunu TabListener). Bu nedenle, bir parça seçimi, bir sekme seçimindeki düzenden asla ayrılmayacaktır ve üst üste binen içeriği (her iki parçayı da tutan FrameLayout nedeniyle) kalmaya devam edecektir.

Yukarıda hata etkilenmez geri aramaları yalnızca birinden kendi işinin hepsini yapıyor TabListener arayüzüne (onTabSelected()) başka uygulama yazdık:

public class TabListenerImpl implements ActionBar.TabListener { 

    private List<TabInfo> mTabs = new ArrayList<TabInfo>(); 
    private Context mContext; 

    public TabListenerImpl(Context context) { 
     mContext = context; 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 

    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     // iterate over all of the tabs, match the tag we have and see if 
     // we also have a fragment instance for it. If we don't, create one 
     // and add it to the container, if we have an instance simply attach 
     // it. Detach every other tag which doesn't match the tag. 
     for (TabInfo t : mTabs) { 
      if (tab.getTag() == t.tag) { 
       if (t.pageFragment == null) { 
        t.pageFragment = Fragment.instantiate(mContext, 
          t.clazz.getName()); 
        ft.add(android.R.id.content, t.pageFragment, t.tag); 
       } else { 
        ft.attach(t.pageFragment); 
       } 
      } else { 
       if (t.pageFragment != null && !t.pageFragment.isDetached()) { 
        ft.detach(t.pageFragment); 
       } 
      } 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     // faulty method 
    } 

    /** 
    * Call this method BEFORE you call the actionBar.addTab() method! 
    * 
    * @param tag 
    *   a String representing the tag that was set on the tab to 
    *   identify itself 
    * @param clazz 
    *   the class of the Fragment 
    */ 
    public void addTab(String tag, Class<? extends Fragment> clazz) { 
     TabInfo ti = new TabInfo(); 
     ti.clazz = clazz; 
     ti.tag = tag; 
     mTabs.add(ti); 
    } 

    // wrapper class 
    private class TabInfo { 
     Class<? extends Fragment> clazz; 
     Fragment pageFragment; 
     String tag; 
    } 

} 

Hangi sonra yapabilirseniz Ben içerik görünüm olarak bir kap ayarlamak için tavsiye (ve ayrıca sekme içerik için) ve android.R.id.content kabı kullanmak ister

TabListenerImpl listener = new TabListenerImpl(this); 
Tab tab = actionBar.newTab().setText("TAB1").setTag("TAB1").setTabListener(listener); 
listener.addTab("TAB1", Tab1Class.class); 
actionBar.addTab(tab); 

tab = actionBar.newTab().setText("TAB2").setTag("TAB2").setTabListener(listener); 
listener.addTab("TAB2", Tab2Class.class); 
actionBar.addTab(tab); 

: olarak kullanmak. Uygulamamın yapılandırma değişikliklerine dikkat etmediğini unutmayın.

+0

Awesome! Bir çok problemle karşılaştım çünkü uygulamanın API 10 cihazlarında çalışmasını istiyorum. Umarım insanlar bu eski telefonları çırpmaya ve Android 4 ile daha yenilerini alırlar. BTW, bu sekmeleri kullanırken uygulamamın neden bir başlığı olmadığını biliyor musunuz? Ya da neden menümüm bu noktalara daraldı bende bile android var: showAsAction = "always" '? – MikkoP

+0

@MikkoP * Bu sekmeleri kullanırken uygulamamın neden bir başlığı olmadığını biliyor musunuz?* - Bu sadece sekmeleri kullandığınızda oluyor? Ve her zaman 'actionBar.setTitle()' yöntemini kullanabilirsiniz. * Ya da neden menümüm bu noktalara daraltsa da bende android var: showAsAction = "her zaman"? * - taşma menüsünde menü öğeleriniz var mı (3 nokta görüntüsünü tıklattığınızda görünen popup)? – Luksprog

+0

Sadece bu sekmeleri kullandığımda olur. actionBar.setTitle() 'hiçbir şeyi değiştirmez, Etkinlikten setTitle()' yi de yapmaz. Ve evet, bu menü öğeleri taşma menüsünde gösteriliyor. Tekrar yeni bir soru yayınladım, bu yüzden birisi cevap verirse, başkalarının bunu bulabileceği ve yardım alabileceği daha iyi bir olasılık var. http://stackoverflow.com/questions/19660334/menu-collapsing-when-using-actionbar-tabs-for-navigation – MikkoP

İlgili konular