Spinner监听器改变活动

时间:2017-10-13 17:01:40

标签: android android-fragments callback

我有一个标签式活动,其工具栏中有一个微调器。每当微调器值发生变化时,我都需要触发选项卡片段中的更改。

到目前为止,我已经通过从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) {

            }
        });
    }

1 个答案:

答案 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)通知所有片段。