调用片段方法而不实例化实际片段

时间:2017-06-27 22:02:25

标签: android android-fragments

我不是android中的高级用户,我不知道这是否是最佳方式,但我的结构有问题。在做webapps和桌面应用程序时,我习惯于将逻辑和表示彼此分开,我尝试在android中执行此操作。

到目前为止,我已经为每个片段中的每个“视图”提供了逻辑,因此我想为每个活动中的每个按钮设置一个onClick函数(因为这是谷歌推荐的),只对每个片段进行方法调用从那里处理逻辑..问题是当我使用导航抽屉和推荐的接口实现时,我无法达到功能,因为我没有实现类,而是朝着片段接口工作。

到目前为止,我已经将其用于处理菜单点击和更改片段:

private void displayFragment(int menuId) {
    Fragment fragment = null;

    switch (menuId) {
        case R.id.nav_search:
            fragment = new SearchFragment();
            break;
        case R.id.nav_create_ticket:
            break;
        case R.id.nav_logout:
            LogoutDialogFragment logoutDialogFragment = new LogoutDialogFragment();
            logoutDialogFragment.show(getSupportFragmentManager(), "Logud");
            break;
    }

    //replacing the fragment
    if (fragment != null) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.content_fragment_container, fragment);
        ft.commit();
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
}

所以我当然只能调用从接口实现的方法,而不是我的“searchfragment”类的公共函数。我不认为这是正确的方法,但我想要实现的是什么像这样:

public void searchBtnClicked(View view) {
    fragment.searchForLicensePlate();
}

有更好的方法吗?我不认为我应该在searchBtnClicked方法中实例化一个searchfragment,因为片段已经在displayFragment中启动了。

由于

1 个答案:

答案 0 :(得分:1)

1.-抽屉(NavigationView)是一个ViewGroup,您可以在其中添加片段然后随意做任何事情。

<android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        android:background="@drawable/side_nav_bar">

        <fragment
            android:id="@+id/drawerFragment"
            android:name="cl.cutiko.someapp.views.main.drawer.DrawerFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

</android.support.design.widget.NavigationView>

2.-如果要使用默认实现,则不需要在片段中包含每个函数,您可以使用Presenter并将演示者的结果返回给View。请参阅MVP设计模式here