我不是android的高级用户,我不知道这是否是最佳方法,但我的结构存在问题。在做网络应用程序和桌面应用程序时,我习惯于将逻辑和表示彼此分开,我尝试在android中做到这一点。
到目前为止,我对每个片段中的每个“视图”都有逻辑,因此我想为每个活动中的每个按钮都具有onClick函数(这是Google推荐的),以便仅对每个片段进行方法调用并处理问题是当我使用导航抽屉和推荐的接口实现时,由于我没有实现类,而是朝着片段接口工作,所以我无法达到功能。
到目前为止,我具有用于处理菜单单击和更改片段的功能:
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方法内实例化一个搜索片段,因为该片段已经在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.-如果要使用默认实现,则不需要将每个功能都放在一个片段中,则可以使用Presenter,并将presenter的结果返回给View。请参阅MVP设计模式here
关于android - 调用 fragment 方法而不实例化实际 fragment ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44790666/