【问题标题】:Why isn't one of my tabs acting like the others?为什么我的一个选项卡不像其他选项卡一样?
【发布时间】:2014-11-19 11:59:29
【问题描述】:

我仍在处理passing data between each fragment in a tab navigation app。最初我使用回调来设置和获取值,但这不能正常工作。我切换到当前的方法,即简单地调用 Activity 中的方法来设置和获取值,但这也很奇怪。

当我运行应用程序时,第一个片段(第一个选项卡)获取值,并且能够更改它。当我滑动到第二个选项卡时,该值不是应有的值。当我滑动到第三个选项卡时,该值是正确的。该值在第一个和第三个选项卡(片段)上是持久的,但第二个选项卡不想合作。

例子:

  • 开始 - persistent_value = 0
  • tab1 显示 - 值显示为 0
  • 更改 tab1 上的值 - persistent_value = 9
  • 滑动到 tab2 - 值显示为 0
  • 滑动到 tab3 - 值显示为 9
  • 更改 tab3 上的值 - persistent_value = 34
  • 滑动到 tab2 - 值显示为 0
  • 滑动到 tab1 - 值显示为 34

我不确定为什么第二个选项卡没有更新,而第一个和第三个选项卡都在更新。是我做错了什么,还是我不知道这里有什么?

这是我用来尝试解决问题的一些示例代码。

public class MainActivity extends Activity implements ActionBar.TabListener {

    SectionsPagerAdapter mSectionsPagerAdapter;
    ViewPager mViewPager;

    int persistent_value = 0; 

    public void setPersistentValue(int value) {
        this. persistent_value = value;
    }

    public int getPersistentValue() {
        return this.persistent_value;
    }

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

        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager(), this);

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

         mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }
        });

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

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

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        private Context context;

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

        public SectionsPagerAdapter(FragmentManager fm, Context context) {
            super(fm);
            this.context = context;
        }

        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
                case 0:
                    return getResources().getString(R.string.tab_one_title);
                case 1:
                    return getResources().getString(R.string.tab_two_title);
                case 2:
                    return getResources().getString(R.string.tab_three_title);
            }
            return null;
        }
    }

    public class MainFragment extends Fragment {

        private static final String ARG_SECTION_TYPE = "section type";

        int persistent_value;

        public MainFragment(){}

        public MainFragment(int sectionNumber) {
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_TYPE, sectionNumber);
            setArguments(args);
        }

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

            persistent_value = ((MainActivity)getActivity()).getPersistentValue;

            TextView textView = (TextView) rootView.findViewById(R.id.the_value);
            textView.setText(Integer.toString(this.persistent_value));

            return rootView;
        }

        @Override
        public void onPause() {
            super.onPause();
            ((MainActivity)getActivity()).setPersistentValue(this.persistent_value);
        }

        @Override
        public void onResume() {
            super.onResume();
            persistent_value = ((MainActivity)getActivity()).getPersistentValue;

            View rootView = getView();
            TextView textView = (TextView) rootView.findViewById(R.id.the_value);
            textView.setText(Integer.toString(this.persistent_value));
        }
    }
}

【问题讨论】:

    标签: android android-fragments tabs


    【解决方案1】:

    看来你走错路了。

    如果您需要在片段之间传递数据,则需要使用接口,而且您不会将数据直接从一个片段传递到另一个片段,而是先将其传递给活动,然后再传递给接收者片段

    片段-片段通讯请参考此链接

    http://developer.android.com/training/basics/fragments/communicating.html

    【讨论】:

    • 这是我最初尝试过的,但我看到了同样的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多