簡體   English   中英

帶有3個選項卡的ActionBar compact:出現碎片問題

[英]ActionBar compact with 3 tabs: issue with fragments

我目前在一個新的android項目中工作。

我將ActionBar CompactTab navigation mode

我在“活動”中添加了3 tabs

在第一個Fragment中,有一個listView和TextView(女巫包含list的選定行的文本)

現在,當我選擇第二個選項卡(片段(空))並返回到我的第一個片段時,當我選擇第三個選項卡(片段3為空)並返回到我的第一個fragent時,TextView包含選定的值BUT 。 TextView已啟動。 我認為我的問題出在TabListener中

誰能幫我! 這是代碼(簡體)

主要活動:

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

        /** Getting a reference to action bar of this activity */
        mActionbar = getSupportActionBar();     

        /** Set tab navigation mode */
        mActionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        /** set HomeButton to true */
        mActionbar.setHomeButtonEnabled(true);

        /** Getting a reference to ViewPager from the layout */
        mPager = (ViewPager) findViewById(R.id.pager);

        /** Getting a reference to FragmentManager */
        FragmentManager fm = getSupportFragmentManager();

        /** Defining a listener for pageChange */
        ViewPager.SimpleOnPageChangeListener pageChangeListener = new ViewPager.SimpleOnPageChangeListener(){
                @Override
                public void onPageSelected(int position) {
                        super.onPageSelected(position);
                        mActionbar.setSelectedNavigationItem(position);
                }

        };

        /** Setting the pageChange listener to the viewPager */
        mPager.setOnPageChangeListener(pageChangeListener);

        /** Creating an instance of FragmentPagerAdapter */
        MyFragmentPagerAdapter fragmentPagerAdapter = new MyFragmentPagerAdapter(fm);

        /** Setting the FragmentPagerAdapter object to the viewPager object */
        mPager.setAdapter(fragmentPagerAdapter);

        mActionbar.setDisplayShowTitleEnabled(true);

        /** Defining tab listener */
        ActionBar.TabListener tabListener = new ActionBar.TabListener() {

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

                        @Override
                        public void onTabSelected(Tab tab, FragmentTransaction ft) {
                                mPager.setCurrentItem(tab.getPosition());

                        }

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

                /** Creating fragment1 Tab */
                Tab tab = mActionbar.newTab()
                                   .setText("Categories")                                   
                                   .setTabListener(tabListener);

                mActionbar.addTab(tab, 0, false);

                /** Creating fragment2 Tab */
                tab = mActionbar.newTab()
                               .setText("Acceuil")                               
                               .setTabListener(tabListener);

                mActionbar.addTab(tab, 1, true);  
                /** Creating fragment3 Tab */
                tab = mActionbar.newTab()
                               .setText("Services")                               
                               .setTabListener(tabListener);

                mActionbar.addTab(tab, 2, false);       


    }

片段2 ::

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        categories = inflater.inflate(R.layout.fragment_categories, container, false);
         list= (ListView)categories.findViewById(R.id.listCategories);
          // Defined Array values to show in ListView
         String[] values = new String[] { "Android List View", 
                                          "Adapter implementation",
                                          "Simple List View In Android",
                                          "Create List View Android", 
                                          "Android Example", 
                                          "List View Source Code", 
                                          "List View Array Adapter", 
                                          "Android Example List View" 
                                         };

         ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(),android.R.layout.simple_list_item_1, android.R.id.text1, values);
         // Assign adapter to ListView
         list.setAdapter(adapter); 
        t =(TextView)categories.findViewById(R.id.textView1);
         list.setOnItemClickListener(new OnItemClickListener()
         {
             public void onItemClick(AdapterView<?> parent,View v, int position, long id)
          {
                 Toast.makeText(getActivity().getBaseContext(),"category " + (position + 1) +" selected",Toast.LENGTH_SHORT).show();
                    t.setText("category " + (position + 1) +" selected");


           }
         });
        return categories;
    }

屏幕截圖

當我從listView(片段1)選擇行==>片段2 ==>返回片段1時

在此處輸入圖片說明

當我從listView(片段1)=>選擇片段3 ==>返回片段1時

在此處輸入圖片說明

在您的主Activity的onCreate()中,初始化ViewPager ,添加:

mPager.setOffscreenPageLimit(2);

根據Android文檔setOffscreenPageLimit()

設置在空閑狀態下視圖層次結構中應保留到當前頁面任一側的頁面數。 超出此限制的頁面將在需要時從適配器重新創建。

這是作為優化提供的。 如果您事先知道需要支持的頁面數或頁面上具有延遲加載機制,則調整此設置可以使分頁動畫和交互的流暢性得到好處。 如果您只有很少的頁面(3-4)可以一次全部保持活動狀態,則隨着用戶來回翻頁,新創建的視圖子樹的布局將花費更少的時間。

您應將此限制保持在較低水平,尤其是在頁面布局復雜的情況下。 此設置默認為1。

由於默認設置為1,因此當您從第一個選項卡開始並導航到第三個選項卡時,當您導航回第一個選項卡時將重新創建第一頁(即片段)。 將此值設置為2時,即使導航到第三個選項卡,該片段仍會保留在第一個選項卡中。

嘗試在片段中使用setRetainInstance()

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

這樣,片段實例不會被破壞,只會破壞其視圖層次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM