对碎片及其活动的困惑

时间:2016-05-12 17:22:41

标签: android android-fragments

我有一个TabLayout和ViewPager来保存和导航我的片段(其中3个)并且工作正常但是我对如何与每个片段进行交互(例如按钮点击或编辑文本)感到困惑。这是我的主要活动xml。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">

<android.support.design.widget.TabLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tabLayout"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:background="@color/colorPrimary"
    app:tabMode="fixed"
    app:tabGravity="fill" />

<android.support.v4.view.ViewPager
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/viewPager"
    android:layout_centerHorizontal="true"
    android:layout_below="@+id/tabLayout" />

</RelativeLayout>

这是它的活动。

public class ActivityMain extends AppCompatActivity {

private String tabTitles[] = new String[] { "contacts", "home", "search" };

TabLayout tabLayout;
ViewPager viewPager;

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

    viewPager = (ViewPager) findViewById(R.id.viewPager);
    viewPager.setAdapter(new CustomAdapater(getSupportFragmentManager(),getApplicationContext()));

    tabLayout = (TabLayout) findViewById(R.id.tabLayout);
    tabLayout.setupWithViewPager(viewPager);

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }
    });

}

private class CustomAdapater extends FragmentPagerAdapter {

    private String fragments [] = {"contacts", "home", "search"};

    public CustomAdapater(FragmentManager supportFragmentManager, Context applicationContext) {
        super(supportFragmentManager);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return new FragmentContacts();
            case 1:
                return new FragmentMain();
            case 2:
                return new FragmentSearch();
            default:
                return null;
        }
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        // Generate title based on item position
        return tabTitles[position];
    }
}
}

这是片段活动。

public class FragmentSearch extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    return inflater.inflate(R.layout.fragment_search,container,false);
}
}

现在在我的R.layout.fragment_search中说我只是为了举例说明了一个按钮,我该如何为它设置一个onclicklistener?它在FragmentSearch或ActivityMain中吗?我四处寻找,但我只是变得更加困惑。

2 个答案:

答案 0 :(得分:1)

您可以通过执行以下操作在片段的onCreateView方法中设置onClickListener:

void AClass::save(){
    ......
    Base base = .....;
    someobj.set(std::make_unique<Base>(&base)));
    ......
} 

正如您所见,public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment1, container, false); myButton = (Button) rootView.findViewById(R.id.buttonId); myButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click } }); return rootView; } 的所有内容都是相同的。唯一的区别是你必须充气才能查看和使用该视图来查找适当的组件(例如按钮,textviews ..)

答案 1 :(得分:1)

现在,如果你想在Fragments之间进行通信,你需要实现更多的东西。基本方法是使用您的活动实现的接口,因此每个片段都可以在活动中调用这些方法。

还有一些消息库,例如Otto和EventBus,它们不仅可以在片段之间发送内容,还可以在服务之间发送内容。