我有一个标签式活动,其工具栏中有一个微调器。每当微调器值发生变化时,我都需要触发选项卡片段中的更改。
到目前为止,我已经通过从Fragment中获取cropsSpinner实例来实现它。但是它根本不能正常工作。我是听众的新手;有没有办法用Android回调来做到这一点?
ExtensionActivity.java
public class ExtensionActivity extends AppCompatActivity {
private SectionsPageAdapter mSectionsPageAdapter;
@BindView(R.id.container) ViewPager mViewPager;
@BindView(R.id.tabs) TabLayout tabLayout;
@BindView(R.id.toolbar) Toolbar toolbar;
@BindView(R.id.spinner_nav) public Spinner cropsSpinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_extension);
ButterKnife.bind(this);
mSectionsPageAdapter = new SectionsPageAdapter(getFragmentManager());
setupViewPager(mViewPager);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
tabLayout.setupWithViewPager(mViewPager);
}
private void setupViewPager(ViewPager viewPager){
SectionsPageAdapter adapter = new SectionsPageAdapter(getFragmentManager());
adapter.addFragment(new ExtDescFragment(),"Description");
adapter.addFragment(new ExtLandPFragment(),"Land Preparation");
viewPager.setAdapter(adapter);
}
ExtDescFragment.java
public class ExtDescFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_ext_desc, container, false);
ButterKnife.bind(this,view);
((ExtensionActivity)getActivity()).cropsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
CROP =((ExtensionActivity)getActivity()).cp.get(position);
Log.e("CROP",CROP);
getCropInf();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
答案 0 :(得分:1)
有关您的其他信息,我建议您让cropperSpinner
隐私并使用列表自定义监听器,如:
interface OnCropperSpinnerSelectedListener {
void onItemSelected(int pos);
}
然后在 ExtensionActivity :
中存储一个监听器列表List<OnCropperSpinnerSelectedListener> listeners;
之后写一个setter方法将监听器添加到监听器列表:
void addCropperSpinnerSelectedListener(OnCropperSpinnerSelectedListener listener) {
listeners.add(listener);
}
然后,您必须在 ExtensionActivity 中实现OnItemSelectedListener:
cropsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
for(int i = 0; i < listeners.size(); i++) {
listeners.get(i).onItemSelected(position);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
最后,当您希望任何Fragment侦听微调器值更改事件时(例如: ExtDescFragment ),只需调用此片段的addCropperSpinnerSelectedListener()
内的方法onCreate()
并实现你自己的逻辑。
解释:因此,每当用户在微调器上选择项目时,AdapterView.OnItemSelectedListener
都会调用onItemSelected()
,这里我们遍历我们的自定义侦听器列表,该列表与片段和调用有关联我们的onItemSelected(int pos)
通知所有片段。