Jaw*_*wad 40 navigation android android-fragments
我一直在寻找如何在抽屉打开/关闭图标(从汉堡包到箭头)到简单的向后箭头之间切换的方法.我的应用程序目前只有一个Activity在几个片段之间切换.有一次,我想在一个主要片段(即抽屉中的一个片段)之间转换为分层次在前一个片段下的片段(即"添加新片段").在这个新片段中,我想让工具栏显示后退按钮而不是抽屉按钮.
我一直在环顾四周,尝试不同的解决方案.以下是最值得注意的:
目前,我正在考虑一种创建自定义图标的漫长而艰巨的方法,我隐藏并显示(并隐藏/显示本机抽屉图标).但是,有没有更好的方法在抽屉和后退按钮之间切换?
作为一个侧面相关的问题,我一直在查看Material Design文档,并且一些示例在左上角有一个X. 与实现抽屉vs后退/向上按钮相比,实现起来有多么不同?
谢谢〜
编辑:
我可以弄清楚如何替换图标,但我如何获得点击事件?
到目前为止,这是我最好的领导:
我现在尝试过的:
mDrawerToggle.setDrawerIndicatorEnabled(useDrawer);)item.getItemId() == android.R.id.home为true.这些日志语句都没有为了更好的上下文,我现在有一个全屏片段,在菜单中添加一个"保存"按钮,并将抽屉图标更改为"X".片段可以获取保存菜单事件,但是在点击X时甚至不能获得活动和抽屉.
根据要求,这里有一些代码.请注意,这都是来自这个我正在积极研究的Github回购(注意我在这里或那里有一些无用的功能来进行快速测试).
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Add the toolbar
mToolbar = (Toolbar) findViewById(R.id.toolbar);
if (mToolbar != null) {
setSupportActionBar(mToolbar);
}
// Initialize the drawer
mNavigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
// Set up the drawer
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout),
mToolbar);
// TODO: Check if this helps to catch the main toolbar button click
getSupportActionBar().setDisplayShowHomeEnabled(true);
// Get the titles for the Toolbar
mTitles = getResources().getStringArray(R.array.drawer_items);
mDrawerPosition = -1;
if (savedInstanceState == null) {
// If there was no saved position, then the default, starting position should be used
forceChangeItemSelected(0);
}
else {
// Otherwise, get the saved position from the bundle
int position = savedInstanceState.getInt(KEY_DRAWERPOS);
mNavigationDrawerFragment.setSelectedItem(position);
// Title needs to be re-set
getSupportActionBar().setTitle(mTitles[position]);
}
// If I include the below bit, then the DrawerToggle doesn't function
// I don't know how to switch it back and forth
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(LOG_TAG, "Navigation was clicked");
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
Log.d(LOG_TAG, "Activity responding to menu click...");
if(item.getItemId() == android.R.id.home) Log.d(LOG_TAG, "Activity got it....");
// If the fragment is supposed to handle things, then let it
if(mIsFragmentHandlingMenus) return false;
int id = item.getItemId();
if(id == R.id.save) {
// This isn't implemented! If chosen, then there's a bug!
Log.e(LOG_TAG, "onOptionsItemSelected: Save was selected!");
}
return super.onOptionsItemSelected(item);
}
@Override
public void fragmentHandlingMenus(boolean isFragmentHandlingMenus) {
// Simply store the setting
mIsFragmentHandlingMenus = isFragmentHandlingMenus;
// Toggle the drawer as necessary
mNavigationDrawerFragment.toggleDrawerUse(!isFragmentHandlingMenus);
}
Run Code Online (Sandbox Code Playgroud)
public void toggleDrawerUse(boolean useDrawer) {
// Enable/Disable the icon being used by the drawer
mDrawerToggle.setDrawerIndicatorEnabled(useDrawer);
// TODO: Enable/Disable the drawer even being able to open/close
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d(LOGTAG, "Drawer responding to menu click...");
if(item.getItemId() == android.R.id.home) Log.d(LOGTAG, "Drawer got it....");
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Allow this fragment to handle toolbar menu items
setHasOptionsMenu(true);
// Set up the toolbar
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
((ActionBarActivity) getActivity()).getSupportActionBar().setHomeAsUpIndicator(android.R.drawable.ic_menu_close_clear_cancel);
((ActionBarActivity) getActivity()).getSupportActionBar().setTitle(getResources().getString(R.string.title_addgoal));
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Cache the Activity as the frag handler if necessary
if(mFragHandler == null)
mFragHandler = (TransactionHandler.FragmentTransactionHandler) getActivity();
// Tell the Activity to let fragments handle the menu events
mFragHandler.fragmentHandlingMenus(true);
}
@Override
public void onDetach() {
super.onDetach();
// Tell the Activity that it can now handle menu events once again
mFragHandler.fragmentHandlingMenus(false);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.save_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d(LOGTAG, "Item id: " + item.getItemId() + " | Save id: " + R.id.save);
Toast.makeText(getActivity(), "Fragment activated!", Toast.LENGTH_SHORT).show();
switch (item.getItemId()) {
case R.id.save:
return true;
case android.R.id.home:
return true;
default:
break;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这是我最终解决的最终解决方案,在下面接受的答案的帮助下:
NavigationDrawerFragment:
private View.OnClickListener mOriginalListener;
public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
/* Rest of setting up code */
// Save the default listener after setting everything else up
mOriginalListener = mDrawerToggle.getToolbarNavigationClickListener();
}
// Tells the toolbar+drawer to switch to the up button or switch back to the normal drawer
public void toggleDrawerUse(boolean useDrawer) {
// Enable/Disable the icon being used by the drawer
mDrawerToggle.setDrawerIndicatorEnabled(useDrawer);
// Switch between the listeners as necessary
if(useDrawer)
mDrawerToggle.setToolbarNavigationClickListener(mOriginalListener);
else
mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), "Custom listener", Toast.LENGTH_SHORT).show();
}
});
}
Run Code Online (Sandbox Code Playgroud)
mat*_*lem 44
把这段代码放入onCreate()你的Activity.对我来说效果很好.即使使用compileSdk 23和更高.
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if(toolbar != null) {
toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
toggle.syncState();
drawer.setDrawerListener(toggle);
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true); // show back button
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
} else {
//show hamburger
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
toggle.syncState();
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
drawer.openDrawer(GravityCompat.START);
}
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
mix*_*xel 27
它应该适用于最新的API 24.
在你的活动中onCreate()这样做:
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
final DrawerLayout drawer = (DrawerLayout) view.findViewById(R.id.drawer_layout);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
final View.OnClickListener originalToolbarListener = toggle.getToolbarNavigationClickListener();
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
toggle.setDrawerIndicatorEnabled(false);
toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getSupportFragmentManager().popBackStack();
}
});
} else {
toggle.setDrawerIndicatorEnabled(true);
toggle.setToolbarNavigationClickListener(originalToolbarListener);
}
}
});
Run Code Online (Sandbox Code Playgroud)
nat*_*rio 12
这可能不是你想听到的,但即使从概念的角度来看,我也会去寻找新的活动而不是片段.
你的主要活动严格地与抽屉相关联,因此加载一个新的片段而无法访问抽屉对我来说没有任何意义(但如果您这么认为,请随意等待其他答案).一项新的活动可以解决这两个问题,因为它没有抽屉,可能是主要的孩子.
你的旁边问题看起来也很明显."添加新"活动可以很好地适应指南中的"全屏对话框"视觉模式.看到:
http://www.google.com/design/spec/components/dialogs.html#dialogs-full-screen-dialogs
这种模式在右上角有一个"保存",正按钮和一个X.从概念上讲,X按钮是取消/中止一个进程,而不是导航一些后台.这意味着你在不让任何行动发生的情况下解雇某些事情.这非常适合您想要做的事情.
从设计的角度来看,它很容易通过一个新的Activity,可以保持在其他人之上.此外,如果碎片的点基本上能够在平板电脑和更大的屏幕中同时代表两个或更多 - 再次 - 我不会对我左边的旧片段和右边的"添加新"片段感到高兴.
相反 - 在平板电脑上 - 我会按指南的建议进行浮动对话.
http://www.google.com/design/spec/components/dialogs.html#dialogs-confirmation-dialogs
所以全屏活动带有一个用于手机的X按钮,以及用于平板电脑的浮动对话框(底部带有按钮).对我而言,这是最准则一致的方法.
我建议阅读整个链接.关于< - 和X之间的区别,
X与向上箭头不同,向上箭头在持续保存视图状态或应用程序具有草稿或自动保存功能时使用.例如,在"设置"中使用向上箭头,因为所有更改都会立即提交.
并且
触摸此设置示例中的X 将放弃所有更改.仅在触摸保存时才会保存更改.
| 归档时间: |
|
| 查看次数: |
33987 次 |
| 最近记录: |