为什么我的其中一个标签与其他标签不同?

时间:2014-11-19 11:59:30

标签: android android-fragments tabs

我还在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));
        }
    }
}

1 个答案:

答案 0 :(得分:0)

看来你的方式错了。

如果你需要在片段之间传递数据,你需要使用一个接口,而且你不会直接将数据从一个片段传递到另一个片段,而是将它首先传递给activity,然后传递给接收器片段< / p>

请参阅此链接以获取片段 - 片段通信

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