我不是 android 的高级用户,我不知道这是否是最佳方式,但我的结构有问题。在做 webapps 和 desktop apps 的时候,我已经习惯了将逻辑和展示彼此分开,我尝试在 android 中做到这一点。
到目前为止,我在每个 fragment 中都有每个“ View ”的逻辑,所以我想为每个 Activity 中的每个按钮都有一个 onClick 函数(这是谷歌推荐的),只对每个 fragment 进行一个方法调用,并从那里处理逻辑。问题是当我使用抽屉导航和推荐的接口(interface)实现时,我无法实现这些功能,因为我没有实现类,而是朝着 fragment 接口(interface)努力。
到目前为止,我有这个用于处理菜单点击和更改 fragment :
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);
}
所以我当然只能调用从接口(interface)实现的方法,而不是我的“searchfragment”类的公共(public)函数。我不认为这是正确的方法,但我想要实现的是像这样:
public void searchBtnClicked(View view) {
fragment.searchForLicensePlate();
}
有没有更好的方法?我认为我不应该在 searchBtnClicked 方法中实例化 searchfragment,因为 fragment 已经在 displayFragment 中启动。
谢谢
最佳答案
1.-抽屉(NavigationView)是一个ViewGroup,你可以在里面添加一个Fragment,然后做任何你想做的。
<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.- 如果您想使用默认实现,那么您不需要将每个函数都放在一个 fragment 中,您可以使用 Presenter 并将 Presenter 的结果返回给 View。请参阅 MVP 设计模式 here
关于android - 在不实例化实际 fragment 的情况下调用 fragment 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44790666/