2017-10-13 103 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)通知所有片段定製偵聽器列表中。