Reputation: 2643
I have a tabbed activity that has a spinner in its Toolbar. I need to trigger changes in the tab fragments whenever the spinner value changes.
I have so far implemented it by getting the cropsSpinner instance from the Fragment. However it's not working as needed. I am new to listeners; is there a way I can do this with Android callbacks?
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) {
}
});
}
Upvotes: 1
Views: 599
Reputation: 10152
For your additional info I suggest you let your cropperSpinner
private and using list custom listener like:
interface OnCropperSpinnerSelectedListener {
void onItemSelected(int pos);
}
Then store a list of listener in ExtensionActivity:
List<OnCropperSpinnerSelectedListener> listeners;
after that write a setter method to add listener to the listener list:
void addCropperSpinnerSelectedListener(OnCropperSpinnerSelectedListener listener) {
listeners.add(listener);
}
Then, you have to implement OnItemSelectedListener in ExtensionActivity:
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) {
}
});
Finally, when you want any Fragment to listen to spinner value changes event (Eg: ExtDescFragment), just call the method addCropperSpinnerSelectedListener()
inside onCreate()
of this fragment and implement your own logic.
Explain: So every time user select item on spinner, the AdapterView.OnItemSelectedListener
will call onItemSelected()
, here we loop through our custom listener list that have connection to fragments and call our onItemSelected(int pos)
to notify all fragment.
Upvotes: 1