Android 包含RatingBar的片段在旋转时触发onRatingChanged
我有一个活动实现了ActionBar.TabListener,为导航提供了3个选项卡。在其中一个选项卡中,我引入了一个用于元素评级的评级栏。当前,更改评级会触发一个祝酒词,确认所选评级 当旋转设备的方向时,此toast会再次触发,即使评级没有更改-我知道我可能正在为此选项卡重新绘制片段(尽管在这种情况下,我不明白评级为何持续),但我不知道如何停止。我试图在OnCreateView中检查SavedInstanceState,但如果我仅在它不为null时应用侦听器,则旋转设备将完全删除侦听器 创建时的活动Android 包含RatingBar的片段在旋转时触发onRatingChanged,android,android-fragments,screen-rotation,ratingbar,Android,Android Fragments,Screen Rotation,Ratingbar,我有一个活动实现了ActionBar.TabListener,为导航提供了3个选项卡。在其中一个选项卡中,我引入了一个用于元素评级的评级栏。当前,更改评级会触发一个祝酒词,确认所选评级 当旋转设备的方向时,此toast会再次触发,即使评级没有更改-我知道我可能正在为此选项卡重新绘制片段(尽管在这种情况下,我不明白评级为何持续),但我不知道如何停止。我试图在OnCreateView中检查SavedInstanceState,但如果我仅在它不为null时应用侦听器,则旋转设备将完全删除侦听器 创建时
@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);
}
详细信息片段类
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;
}
}
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;
}
}
我错过了什么明显的技巧?好的,所以我修改了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();
}
}
});
让我不舒服的是,我不知道这是否是一个黑客行为,或者这是否是一个有意的安卓过程——我的标签显然正在被破坏和重建——这是为了布局还是我的实现有缺陷
我正在努力理解最佳实践,所以如果不是这样,请随时指出“正确的方法”