كيفية حذف علامة تبويب باستخدام شريط الإجراءات وصفحة العرض وأجزاء متعددة؟

StackOverflow https://stackoverflow.com//questions/11656197

سؤال

أنا أستخدم الكود الذي وجدته هنا.

public class ActionBarTabs extends SherlockFragmentActivity {
CustomViewPager mViewPager;
TabsAdapter mTabsAdapter;
TextView tabCenter;
TextView tabText;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);

    mViewPager = new CustomViewPager(this);
    mViewPager.setId(R.id.pager);

    setContentView(mViewPager);
    ActionBar bar = getSupportActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);

    mTabsAdapter = new TabsAdapter(this, mViewPager);

    mTabsAdapter.addTab(bar.newTab().setText("Home"),
            ToolKitFragment.class, null);
    mTabsAdapter.addTab(bar.newTab().setText("FujiSan"),
            FujiFragment.class, null);
}

public static class TabsAdapter extends FragmentPagerAdapter implements
        ActionBar.TabListener, ViewPager.OnPageChangeListener {
    private final Context mContext;
    private final ActionBar mActionBar;
    private final ViewPager mViewPager;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

    static final class TabInfo {
        private final Class<?> clss;
        private final Bundle args;

        TabInfo(Class<?> _class, Bundle _args) {
            clss = _class;
            args = _args;
        }
    }

    public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) {
        super(activity.getSupportFragmentManager());
        mContext = activity;
        mActionBar = activity.getSupportActionBar();
        mViewPager = pager;
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);
    }

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
        TabInfo info = new TabInfo(clss, args);
        tab.setTag(info);
        tab.setTabListener(this);
        mTabs.add(info);
        mActionBar.addTab(tab);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mTabs.size();
    }

    @Override
    public Fragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.clss.getName(),
                info.args);
    }

    @Override
    public void onPageScrolled(int position, float positionOffset,
            int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int position) {
        mActionBar.setSelectedNavigationItem(position);
    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        Object tag = tab.getTag();
        for (int i = 0; i < mTabs.size(); i++) {
            if (mTabs.get(i) == tag) {
                mViewPager.setCurrentItem(i);
            }
        }
    }

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

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

أحاول تعديله حتى أتمكن من حذف علامات التبويب ديناميكيًا.لقد حاولت ببساطة عن طريق إنشاء هذه الوظيفة:

    public void removeTab(ActionBar.Tab tab) {
        mTabs.remove(tab);
        mActionBar.removeTab(tab);
        notifyDataSetChanged();
    }

لكنني دائمًا أحصل على فهرس خارج الحدود.هل يعرف أحد طريقة جيدة للقيام بذلك؟

يحرر

عن طريق تغيير طريقتي إلى:

    public void removeTab(ActionBar.Tab tab) {
        mTabs.remove(tab.getTag());
        mActionBar.removeTab(tab);
        notifyDataSetChanged();
    }

تمكنت من إزالة علامات التبويب بنجاح.ومع ذلك، عندما أقوم بحذف علامة تبويب ليست تلك الموجودة في أقصى اليمين، فإن العرض (أو الجزء؟) الذي كان مرتبطًا بعلامة التبويب لا يختفي.بدلاً من ذلك، يبدو أنه أصبح مرتبطًا بعلامة التبويب الأعلى التالية.على سبيل المثال، إذا قمت بحذف علامة التبويب 0، فإن عرض علامة التبويب 0 ينتقل فقط إلى علامة التبويب 1.إذا قمت بحذف علامة التبويب ذات المعرف الأعلى، فستختفي علامة التبويب والعرض بشكل صحيح ولكن بعد ذلك أعود عندما أقوم بإضافة علامة تبويب جديدة.

يبدو الأمر كما لو أن هناك قائمة بالأجزاء في مكان ما مرتبطة بعلامات التبويب، ولا يؤدي حذف علامة التبويب إلى حذف الجزء.هل لدى أي شخص أي فكرة عن سبب هذا؟

تحرير2

لقد حاولت حذف الأجزاء باستخدام:

            Fragment fragmentToRemove = getItem(tab.getPosition());
            destroyItem(mViewPager, tab.getPosition(), fragmentToRemove);

و أيضا

        Fragment fragmentToRemove = getItem(tab.getPosition());
        FragmentTransaction fragmentTransaction = mActivity
                .getSupportFragmentManager().beginTransaction();
        fragmentTransaction.remove(fragmentToRemove);
        fragmentTransaction.commit();

ولكن لم ينجح أي منهما حتى الآن.

هل كانت مفيدة؟

المحلول

حصلت عليه! giveacodicetagpre.

وتجاوز dreaditem giveacodicetagpre.

يعمل بشكل مثالي !!!

نصائح أخرى

لقد اكتشفت اليوم للتو أن الحيلة الحقيقية لدعم إدراج علامات التبويب أو إزالتها هي التجاوز FragmentPagerAdapter.getItemPosition():

@Override
public int getItemPosition(Object object) {
    Fragment fragment = (Fragment) object;
    for (int i = 0; i < tabInfos.size(); i++) {
        if (tabInfos.get(i).clss == fragment.getClass()) {
            return i;
        }
    }
    // The tab must have been removed
    return POSITION_NONE;
}

getItemPosition() سيتم استدعاؤه بواسطة ViewPager بعد أن اتصلت notifyDataSetChanged() (بعد إضافة/إزالة علامات التبويب).ال ViewPager يحاول إعادة مزامنة ذاكرة التخزين المؤقت الخاصة به مع هذا المحول.يدعو getItemPosition() لكل "كائن" (جزء) يحمله، ونخبره عن الموضع الذي ينتمي إليه هذا الجزء.إذا لم يكن هناك تطابق، فذلك لأننا حذفنا علامة التبويب هذه، لذا ارجع POSITION_NONE.

لقد وجدت أيضًا أنه من المهم التجاوز FragmentPagerAdapter.getItemId() إذا قمت بإدراج علامات التبويب أو إزالتها، لأن الأجزاء ستغير مواضعها إلى اليسار واليمين.تسمى هذه الطريقة بواسطة FragmentPagerAdapter.instantiateItem() ويتم إلحاقه باسم (سلسلة) للعنصر.يستخدم هذا الاسم للبحث عن جزء موجود مسبقًا باسم مطابق (إذا كان هناك اسم) وإلا لإنشاء مثيل جديد.إليك بعض التعليمات البرمجية:

@Override
public long getItemId(int position) {
    TabInfo info = tabInfos.get(position);
    // The default hashCode() implementation is based on memory address, which will be unique
    int hash = info.clss.hashCode();
    return hash;
}

حسنا - أكل هذا الغداء لمدة أسبوعين.لم أجد أن ما سبق عملت بالنسبة لي على الإطلاق كما هو موضح.أنا أستخدم Android Studio 3.5.1 في حالة هذه الأمور.

ما يلي هو رمز FragmentPagerAdapter في مجمله.أنه يحتوي على معظم كل ما يجب أن تحتاجه.رمز الشظية واضح إلى حد ما لأي كل من شظاياك تحتوي.ولكن اسمحوا لي أن أعرف إذا كان هناك حاجة إلى المزيد أو إذا كان لديك أي أسئلة.

أيضا، إذا كان لديك أي تعليقات أو العثور على أي أخطاء، يرجى نشر تعليق.آمل أن يكون هذا يساعد الآخرين. giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top