2017-10-13 102 views
1

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

我到目前为止通过从Fragment中获取cropSpinner实例来实现它。然而,它不能按需要工作。我对听众是新的;有没有一种方法可以在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

当你选择一个cropperSpinner项时,onItemSelected()和onNothingSelected()会被调用吗? – nhoxbypass

+0

项目得到选择,但我需要所有的片段来检测这种变化,所以我想知道如果我可以创建一个监听器,当微调值更改和实现它在所有的片段 –

+0

因此,你有不同的选项卡,你有每个微调选项卡,如果您更改微调控制器内的数据,则需要它也应该反映在其他片段中。我正确吗? –

回答

1

为了您的其他信息,我建议你让你cropperSpinner私人和使用列表定制的监听,如:

interface OnCropperSpinnerSelectedListener { 
    void onItemSelected(int pos); 
} 

然后在ExtensionActivity听众列表存储:

List<OnCropperSpinnerSelectedListener> listeners; 

后写一个setter方法来监听器添加到侦听器列表:

void addCropperSpinnerSelectedListener(OnCropperSpinnerSelectedListener listener) { 
    listeners.add(listener); 
} 

然后,你必须实施OnItemSelectedListener 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) { 

       } 
}); 

最后,当你想要的任何片段听微调数值变化事件(例如:ExtDescFragment),只需拨打这里面片段onCreate()方法addCropperSpinnerSelectedListener()和实现自己的逻辑。

解释:上微调所以每次用户选择项目时,AdapterView.OnItemSelectedListener将调用onItemSelected(),在这里我们遍历我们有连接片段,并拨打我们onItemSelected(int pos)通知所有片段定制侦听器列表中。