【问题标题】:Android Swipe Tab Action Bar - make changes in tabs persistentAndroid Swipe Tab Action Bar - 使选项卡中的更改持久化
【发布时间】:2014-02-25 19:13:17
【问题描述】:

我现在正在使用 3 个标签,我可以很好地在它们之间切换。但是,假设我在第一个选项卡中进行了一些更改(在 textview 中输入一些内容),然后转到第三个选项卡然后返回,更改消失了。这似乎很明显,因为在我的代码中,我根据我的 xml 布局文件设置 TabFragment 的选项卡布局。当我们滑动到不同的选项卡时,有没有办法保存选项卡的布局,以便我以后可以切换回这个已保存的选项卡布局?

(我观察到的一件有趣的事情是,当我在前 2 个选项卡之间切换时,更改保持不变,但每当我转到第三个选项卡并返回第一个选项卡时,它们就会消失)

我的主要活动文件(我从this answer得到代码)

public class Tob extends FragmentActivity implements ActionBar.TabListener 
{

CollectionPagerAdapter mCollectionPagerAdapter;
ViewPager mViewPager;

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

    mCollectionPagerAdapter = new CollectionPagerAdapter(getSupportFragmentManager());

    final ActionBar actionBar = getActionBar();
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    mViewPager = (ViewPager) findViewById(R.id.pager);
    mViewPager.setAdapter(mCollectionPagerAdapter);
    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() 
    {
        @Override

        public void onPageSelected(int position) 
        {
            actionBar.setSelectedNavigationItem(position);
        }

    });
    for (int i = 0; i < mCollectionPagerAdapter.getCount(); i++) 
    {
        actionBar.addTab(actionBar.newTab()
        .setText(mCollectionPagerAdapter.getPageTitle(i))
        .setTabListener(this));
    }

}

public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
{
}

public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
{
    mViewPager.setCurrentItem(tab.getPosition());   
}

public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
{

}

public class CollectionPagerAdapter extends FragmentPagerAdapter 
{
    final int NUM_ITEMS = 3; // number of tabs

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

    @Override

    public Fragment getItem(int i) 
    {
        Fragment fragment = new TabFragment();
        Bundle args = new Bundle();
        args.putInt(TabFragment.ARG_OBJECT, i);
        fragment.setArguments(args);
        return fragment;
    }

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

    @Override
    public CharSequence getPageTitle(int position) 
    {
        String tabLabel = null;
        switch (position) {
            case 0:
                tabLabel = "Tab1";
                break;
            case 1:
                tabLabel = "Tab2";
                break;
            case 2:
                tabLabel = "Tab3";
                break;

        }

        return tabLabel;
    }
}

public static class TabFragment extends Fragment 
{
    public static final String ARG_OBJECT = "object";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {

        Bundle args = getArguments();
        int position = args.getInt(ARG_OBJECT);
        int tabLayout = 0;
        switch (position) 
        {
            case 0:
                tabLayout = R.layout.tob1;
                break;
            case 1:
                tabLayout = R.layout.tob2;
                break;
            case 2:
                tabLayout = R.layout.tob3;
                break;
        }

        View rootView = inflater.inflate(tabLayout, container, false);
        return rootView;

    }

}

我的 activity_main.xml 文件:

<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Tob"/>

tob1.xml 文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tab1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/apppattern" 
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
 tools:context=".MainActivity" >

等等。我的预感是,我需要在切换选项卡时保存它的布局,我只是不确定在哪里做。

【问题讨论】:

    标签: android android-layout android-actionbar android-tabs


    【解决方案1】:

    交叉发帖:saving data on tabs

    您可以使用共享首选项从选项卡中存储和检索用户输入/字符串/数字等。

    首先,在你的类中声明一个 SharedPreference 名称标签。

    public static final String PREFS_NAME = "Blah";
    

    接下来,在您的 onTabUnselected 方法中,将所有与表单相关的文本数据保存到 SharedPreference 中。

    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
    {
         SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
         SharedPreferences.Editor editor = settings.edit();
         editor.putString("userText", (TextView)getViewById(R.id.myTextView).getText());
         editor.commit();
    }
    

    最后,在 onTabSelected 方法中检索 SharedPreference 文本。

    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) 
    {
         SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
         String myText = settings.getString("userText", "Default");
         ((TextView)getViewById(R.id.myTextView)).setText(myText);
    }
    

    这是原始的 Android 文档页面 http://developer.android.com/guide/topics/data/data-storage.html 您可以使用 SharedPreferences 保存字符串、浮点数、布尔值等原语。您还可以保存其他资源(如布局/图像)的 url 字符串,然后检索它们并在 tab1 中动态创建视图。

    【讨论】:

    • 嗯,这似乎是一个足够好的解决方法。有什么办法可以保存整个标签?基本上是因为我也在更改各种按钮的状态(启用/禁用),处理这么多对象会很痛苦。
    • 好的,谢谢,我刚刚意识到,因为我正在处理这些对象,所以在这些函数中使用它们应该没有问题。
    猜你喜欢
    • 1970-01-01
    • 2017-03-07
    • 2019-12-06
    • 2013-11-22
    • 2019-05-11
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多