【问题标题】:Fragment Containing RatingBar Triggers onRatingChanged on Rotation包含 RatingBar 的片段在旋转时触发 onRatingChanged
【发布时间】:2014-05-08 11:05:48
【问题描述】:

我有一个实现 ActionBar.TabListener 的活动,以提供 3 个用于导航的选项卡。在其中一个选项卡中,我引入了 RatingBar 来对元素进行评级。目前,更改评级会触发确认所选评级的祝酒词。

当旋转设备的方向时,这个 toast 会再次触发,即使评级没有改变 - 我知道我可能正在重绘这个标签的片段(虽然在这种情况下我不明白为什么评级仍然存在)但我不明白如何阻止它。我试图检查 OnCreateView 中的 SavedInstanceState 但如果我只在它不为空时应用侦听器,则旋转设备会完全移除侦听器。

Activity onCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_view_pub);

    Intent intent = getIntent();

    pubname = intent.getStringExtra(MainActivity.PUB);

    setTitle(pubname);

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

    mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());

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

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

    // For each of the sections in the app, add a tab to the action bar.
    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
        actionBar.addTab(actionBar.newTab()
                .setText(mSectionsPagerAdapter.getPageTitle(i))
                .setTabListener(this));
    }

    actionBar.setSelectedNavigationItem(1);
}

FragmentPAgerAdapter 类

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return DirectionsFragment.newInstance(position + 1);
            case 1:
                return DetailsFragment.newInstance(position + 1);
            case 2:
                return RelationsFragment.newInstance(position + 1);
        }
        return null;            
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return getString(R.string.title_section1);
            case 1:
                return getString(R.string.title_section2);
            case 2:
                return getString(R.string.title_section3);
        }
        return null;
    }
}

DetailsFragment 类

public static class DetailsFragment extends Fragment {

    private static final String ARG_SECTION_NUMBER = "section_number";

    public static DetailsFragment newInstance(int sectionNumber) {
        DetailsFragment fragment = new DetailsFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

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

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

        View rootView = inflater.inflate(R.layout.fragment_pub_details, container, false);
        RatingBar ratingBar = (RatingBar)rootView.findViewById(R.id.rating);
        ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener(){
            public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {

                Toast.makeText(ratingBar.getContext(),"Your Selected Ratings  : " + String.valueOf(rating),Toast.LENGTH_LONG).show();

            }
        });
        return rootView;

    }
}

我错过了什么明显的技巧?

【问题讨论】:

    标签: android android-fragments screen-rotation ratingbar


    【解决方案1】:

    好的,所以我已将 onRatingChanged 函数更改为仅在 fromUser 布尔值为 true 时触发其内容 - 显然,当系统重绘选项卡时,它不会触发 toast;

    ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener(){
        public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
            if(fromUser){
                Toast.makeText(ratingBar.getContext(),"Your Selected Ratings  : " + String.valueOf(rating),Toast.LENGTH_LONG).show();
            } 
        }
    });
    

    让我感到不舒服的是,我不知道这是否是一个 hack,或者这是否是预期的 android 进程 - 我的选项卡显然正在被破坏和重建 - 这是出于布局目的还是我的实现有缺陷?

    我正在努力理解最佳实践,所以如果不是这样,请随时指出“正确的方法”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      相关资源
      最近更新 更多