因此,我已经能够在我的Android应用程序中实现内置的NavigationDrawer,而不会出现任何问题,并且所有主要片段都已设置并在选中后可以正常工作。
卡住的地方是,在某些片段中,当选择一个项目时,我将需要添加一种向下钻取的功能,例如,一个片段是客户列表,因此选择一个客户然后应在下一个片段的同时推送到下一个片段向用户提供后退选项(我相信这可以通过“主页”按钮完成)。
我遇到的问题是,使用NavigationDrawer模板时,主页按钮现在是用于打开/关闭列表的按钮,因此我似乎无法弄清楚应该如何将主页按钮更改为后退按钮。 ,也不确定是否正确显示了我的下一个片段。下面是选择后移至客户详细信息片段的代码(请注意,现在我尚未将任何数据从客户端列表片段传递给客户端数据蛙人,我只想首先正确获取导航设置):
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_clients, container, false);
thisActivity = this.getActivity();
clientListView = (ListView)rootView.findViewById(R.id.clientListView);
return rootView;
}
//later after the list view adapter has been updated with data
clientListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String name = dataList.get(position).clientName;
Log.d("message", "the client clicked on is: " + name);
Fragment fragment = new FragmentClientDetail();
FragmentManager manager = thisActivity.getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.addToBackStack("clientdetail");
transaction.commit();
}
});
所以我的问题主要是,首先,我实际上是通过用新片段替换容器来正确地处理导航,然后是我需要在第二个片段中进行哪些更改,以使后退按钮成为主按钮而不是NavigationDrawer?
编辑1
因此,在Raghunandan的评论使我进行了一些额外的google搜索之后,我能够使ListView正确提取下一个片段,并且正在调用回调方法,但由于某些原因,我仍然无法从ActionBar主页按钮进行切换将NavigationDrawer样式更改为带有后退箭头的常规导航操作栏。现在,它仍然默认为NavigationDrawer类型的按钮,仍会拉出导航菜单。因此,基本上我想完成的是,当我是应用程序的“主要”片段时,“主页”图标将执行NavigationDrawer操作,并拉出要查看的片段列表,但随后在“ Home”子片段上进行钻取图标应切换为图标的后退选项按钮样式。到目前为止,这是我使用片段中的回调方法来推送子片段的尝试:
@Override
public void callBackList(String fragmentName, String displayName) {
Log.d("message", "callbacklist called");
mTitle = fragmentName;
displayTitle = displayName;
//Push child fragment on top of current fragment
Fragment fragment = new FragmentClientDetail();
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.addToBackStack(null);
//Change action bar style to default action bar style with back button
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setTitle(title);
transaction.commit();
//call to update menu icons for child fragments that may be different than parent fragment
invalidateOptionsMenu();
}
最佳答案
是的,您需要根据列表项单击将片段添加/替换到容器中
您可以将interface用作活动的回调。
Fragment1-> HostingActivity-> Fragment2。添加确保将片段添加到后堆栈。
http://developer.android.com/training/basics/fragments/communicating.html
您可以使用
getActivity().getActionBar().setHomeButtonEnabled(true);
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
更多信息 @
http://developer.android.com/training/implementing-navigation/ancestral.html
范例:
public interface ListItemCallback
{
public void callBackList()
}
然后片段
ListItemCallback mCallback;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (ListItemCallback) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement ListItemCallback");
}
}
然后
clientListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String name = dataList.get(position).clientName;
Log.d("message", "the client clicked on is: " + name);
mCallback.callBackList();
}
});
然后在活动中
public class MainActivity extends Activity implements ListItemCallback
{
...// rest of the code
@Override
public void callBackList(String name)
{
Fragment fragment = new FragmentClientDetail();
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.addToBackStack("clientdetail");
transaction.commit();
}
}