2017-10-13 8 views
1

ツールバーにスピナーを持つタブ付きアクティビティがあります。私は、スピナーの値が変わるたびに、タブフラグメントの変更をトリガーする必要があります。アクティビティを変更するスピナーリスナー

これまで、cropsSpinnerインスタンスをFragmentから取得して実装しました。しかし、それは必要に応じて動作していない。私はリスナーには新しいです。 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にリスナーのリストを格納します。それはリスナーリストにリスナーを追加するためにsetterメソッドを記述した後

List<OnCropperSpinnerSelectedListener> listeners; 

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

次に、あなたがする必要がありますOnItemSelectedListenerをに実装してください。ExtensionActivity

あなたが任意のフラグメントは、スピナー値が変更イベント(例: ExtDescFragment)を聞きたいとき
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) { 

       } 
}); 

最後に、ちょうどこの断片のonCreate()内のメソッドaddCropperSpinnerSelectedListener()を呼び出し、独自のロジックを実装します。

を説明:スピナー上だから、毎回ユーザの選択項目を、AdapterView.OnItemSelectedListenerは、私たちのonItemSelected(int pos)すべての断片を通知する断片への接続を持っていると呼んで当社独自のリスナーのリストをonItemSelected()、ここでループを呼び出します。

関連する問題