2017-03-14 6 views
0

私はそれぞれ独自のフラグメントを持つ2つのタブを含むTabLayoutを持つアクティビティを持っています。私の活動にはFabボタンがあります。私がタブ1にいて、それをクリックすると、何とかViewPagerAdapterのgetItem()メソッドに、 "ねえ、ボタンがクリックされたことを示したいと思います。リスナーを介してアクティビティとViewPagerAdapterの間の通信

私はこれを行う方法がわかりません。私はリスナーを追加するかもしれないと思っていましたが、もう一度実装する方法はわかりません。どんな助けもありがとう。

主な活動:

public class MainActivity extends AppCompatActivity { 
private ViewPager viewPager; 
private ArrayList<Fragment> fragments = new ArrayList<>(); 
private ArrayList<String> titles = new ArrayList<>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    CollapsingToolbarLayout collapsingToolbarLayout = (CollapsingToolbarLayout)findViewById(R.id.collapsing_toolbar); 
    setSupportActionBar(toolbar); 

    fragments.addAll(Arrays.asList(new Tasks(),new Calendar(),new Contacts())); 
    titles.addAll(Arrays.asList(getResources().getString(R.string.fragment_task_title), 
      getResources().getString(R.string.fragment_cal_title),getResources().getString(R.string.fragment_contacts_title))); 
    TabLayout tabLayout = (TabLayout)findViewById(R.id.tabs); 

    final FloatingActionButton fab = (FloatingActionButton)findViewById(R.id.fab); 
    fab.hide(); 

    viewPager = (ViewPager)findViewById(R.id.container); 
    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(),fragments,titles); 
    viewPager.setAdapter(viewPagerAdapter); 
    viewPager.setCurrentItem(1); 
    viewPager.addOnPageChangeListener(new 
    tabLayout.setupWithViewPager(viewPager); 

    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      fabAction(); 
     } 
    }); 

    if (savedInstanceState==null){ 
     if (getSupportActionBar()!=null){ 
      getSupportActionBar().setDisplayShowTitleEnabled(true); 
     } 
    } 
} 
public void fabAction(){ 
    int current = viewPager.getCurrentItem(); 

    switch (current){ 
     case 0:{ 
      //TELL THE VIEWPAGER ADAPTER THAT BUTTON IS CLICKED AND SWITCH FRAGMENTS 
      break; 
     } 
     case 1:{ 
      Toast.makeText(this, "IN TAB 2", Toast.LENGTH_LONG).show(); 
      break; 
     } 
    } 
}} 

ViewPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter{ 
ArrayList<Fragment> fragments; 
ArrayList<String> titles; 
private Fragment mFragmentAtPos0; 
private FragmentManager fragManager; 

//NEED TO IMPLEMENT THE LISTENER IN THIS CLASS TELLING ME THAT THE BUTTON WAS CLICKED IN MAIN ACTIVITY 
public ViewPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments, ArrayList<String>titles) { 
    super(fm); 
    this.fragments = fragments; 
    this.titles = titles; 
    fragManager = fm; 

} 

@Override 
public Fragment getItem(int position) { 
    //Somehow get Indication Here that the button was clicked 

    if (position == 0) 
    { 
     if(mFragmentAtPos0==null){ 
      mFragmentAtPos0 = new Tasks(); 
      fragManager.beginTransaction().replace(R.id.container,mFragmentAtPos0).commit(); 
      notifyDataSetChanged(); 
     } 
     return mFragmentAtPos0; 
    }else{ 
     return fragments.get(position); 

    } 

} 

@Override 
public int getCount() { 
    return fragments.size(); 
} 

@Override 
public CharSequence getPageTitle(int position) { 

    return titles.get(position); 
} 

@Override 
public int getItemPosition(Object object) 
{ 
    if (object instanceof Tasks && mFragmentAtPos0 instanceof AddContact) 
     return POSITION_NONE; 
    return POSITION_UNCHANGED; 
}} 

これは私が発生しているしようと、同様の問題にWIZEの答え@から私のアイデアを得てるものです。ソリューションの全体を把握するための答えに欠けている部分が多すぎます:Replace Fragment Inside ViewPager

答えて

1

これは本当にやっかいです。おそらく、変更するフラグメントにファブを移動し、フラグメント内の変更を処理することを検討する必要があります。 fabがActivity内になければならない場合、Pager Adapter自体からフラグメントを追加/削除することができます。

アダプターはこのようなものになります。

public class CodebaseFragmentPagerAdapter extends FragmentStatePagerAdapter { 

    private List<Fragment> mFragmentList = new ArrayList<Fragment>(); 

    public CodebaseFragmentPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    public void removeItem(int position){ 
     mFragmentList.remove(position == 0 ? 0 : position - 1); 
     this.notifyDataSetChanged(); 
    } 

    public void clearAllItems(){ 
     mFragmentList.clear(); 
     this.notifyDataSetChanged(); 
    } 

    public void updateItem(int position, Fragment fragment){ 
     mFragmentList.set(position, fragment); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     if (mFragmentList.contains(object)) return mFragmentList.indexOf(object); 
     else return POSITION_NONE; 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFrag(Fragment fragment) { 
     mFragmentList.add(fragment); 
     notifyDataSetChanged(); 
    } 
} 

注:アダプター上のタブのレイアウトをサポートしていないので、

使用状況、ニーズに合わせてそれを調整して自由に感じる:

mAdapter = new CodebaseFragmentPagerAdapter(getSupportFragmentManager()); 
mViewPager.setAdapter(mAdapter); 

mAdapter.addFrag(FragmentExample.newInstance()); 
+0

それは良い提案です。私がMainActivityにfabを残したのは、フラグメントの右下隅に配置されているFabを隠す折りたたみツールバーがあるからです。代わりにそのレイアウトを試してみるつもりです。 –

+0

あなたはスクロールのファブを非表示にしたい場合は、この <のFab(FAB Behavoiur付き)/> ない100%確かに似た構造を持つレイアウトを作成することができますが、私はそれがうまくいくと思います –

関連する問題