这篇文章主要围绕ActionBarDrawerToggle无法应用于Android.support.v7.widget.Toolbar和无法应用于所选区域展开,旨在为您提供一份详细的参考资料。我们将全
这篇文章主要围绕ActionBarDrawerToggle无法应用于Android.support.v7.widget.Toolbar和无法应用于所选区域展开,旨在为您提供一份详细的参考资料。我们将全面介绍ActionBarDrawerToggle无法应用于Android.support.v7.widget.Toolbar的优缺点,解答无法应用于所选区域的相关问题,同时也会为您带来Androi ActionBarDrawerToggle&DrawerLayout 双向侧滑动、Android getActionBar vs getSupportActionBar?、android – DrawerLayout和ActionBarDrawerToggle无法解析为某个类型、android – NavigationView和ActionBarDrawerToggle的实用方法。
本文目录一览:- ActionBarDrawerToggle无法应用于Android.support.v7.widget.Toolbar(无法应用于所选区域)
- Androi ActionBarDrawerToggle&DrawerLayout 双向侧滑动
- Android getActionBar vs getSupportActionBar?
- android – DrawerLayout和ActionBarDrawerToggle无法解析为某个类型
- android – NavigationView和ActionBarDrawerToggle
ActionBarDrawerToggle无法应用于Android.support.v7.widget.Toolbar(无法应用于所选区域)
错误说ActionBarDrawerToggle中的ActionBarDrawerToggle()无法应用于android.support.v7.widget.Toolbar然后在实际参数R.id.drawable_ic_drawer(int)下
import android.support.v7.app.ActionBarDrawerToggle; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import android.support.v7.widget.Toolbar;
mDrawerToggle = new android.support.v7.app.ActionBarDrawerToggle( getActivity(),/* host Activity */ mDrawerLayout,/* DrawerLayout object */ R.drawable.ic_drawer,/* nav drawer image to replace 'Up' caret */ R.string.navigation_drawer_open,/* "open drawer" description for accessibility */ R.string.navigation_drawer_close /* "close drawer" description for accessibility */ ) {
据说造成错误的部分是R.drawer.ic_drawer.我该如何解决?
解决方法
android.support.v7.app.ActionBarDrawerToggle.ActionBarDrawerToggle(Activity activity,DrawerLayout drawerLayout,Toolbar toolbar,int openDrawerContentDescRes,int closeDrawerContentDescRes)
您正在传递R.drawable.ic_drawer drawable而不是工具栏,这就是您收到此错误的原因.
创建工具栏并将其添加为操作栏,并将此工具栏传递给此构造函数.
Androi ActionBarDrawerToggle&DrawerLayout 双向侧滑动
本实践在于练习使用 ActionBarDrawerToggle+DrawerLayout 实现双向侧滑栏菜单布局
需要的库文件 android-v7-appcompat
所选要的 jar android-support-v4.jar,android.jar
效果图
点击 Home 菜单 ↓-->searchview 被隐藏
点击照相机 ↓-->searchview 被隐藏
点击搜索 ↓
点击隐藏菜单 ↓
首先是 ActionBar 的菜单设计 toggle_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.actiontabbar.DrawerToggleActivity" >
<item android:id="@+id/action_search"
android:orderInCategory="100"
android:title="@string/action_search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="ifRoom"
/>
<item
android:id="@+id/action_camera"
android:orderInCategory="100"
android:icon="@drawable/ofm_camera_icon"
android:title="@string/action_camera"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:icon="@drawable/ofm_setting_icon"
android:title="@string/action_settings"
app:showAsAction="never"/>
</menu>
布局文件 drawertoggle_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/main_drawer_layout"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<LinearLayout
android:id="@+id/main_left_menu"
android:layout_width="200dip"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="start"
android:background="#f09001"
/>
<LinearLayout
android:id="@+id/main_right_menu"
android:layout_width="200dip"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="end"
android:background="#f09001"
/>
</android.support.v4.widget.DrawerLayout>
Activity 代码
package com.example.actiontabbar;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import android.content.res.Configuration;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.Window;
import android.widget.LinearLayout;
public class DrawerToggleActivity extends ActionBarActivity{
private DrawerLayout mDrawerLayout;
private LinearLayout leftMenuPanel;
private LinearLayout rightMenuPanel;
private ActionBarDrawerToggle actionBarDrawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
forceShowOverflowMenu();
setContentView(R.layout.drawertoggle_layout);
initDrawerLayout();
}
private void initDrawerLayout()
{
mDrawerLayout = (DrawerLayout)findViewById(R.id.main_drawer_layout);
leftMenuPanel = (LinearLayout) findViewById(R.id.main_left_menu);
rightMenuPanel = (LinearLayout) findViewById(R.id.main_right_menu);
mDrawerLayout.setScrimColor(0x000000);
mDrawerLayout.setDrawerShadow(R.drawable.goss_whitemask_drawable,GravityCompat.START);
actionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.abc_ic_menu_moreoverflow_normal_holo_dark, R.string.action_toggle,R.string.action_toggle){
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
//actionbar上的home icon
//END即gravity.right 从右向左显示 START即left 从左向右弹出显示
mDrawerLayout.closeDrawer(rightMenuPanel);//关闭抽屉
if (mDrawerLayout.isDrawerVisible(leftMenuPanel)) {
mDrawerLayout.closeDrawer(leftMenuPanel);//关闭抽屉
} else {
mDrawerLayout.openDrawer(leftMenuPanel);//打开抽屉
}
return true;
}
else if(item.getItemId()==R.id.action_camera)
{
mDrawerLayout.closeDrawer(leftMenuPanel);//关闭抽屉
//END即gravity.right 从右向左显示 START即left 从左向右弹出显示
if (mDrawerLayout.isDrawerVisible(rightMenuPanel)) {
mDrawerLayout.closeDrawer(rightMenuPanel);//关闭抽屉
} else {
mDrawerLayout.openDrawer(rightMenuPanel);//打开抽屉
}
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onDrawerClosed(View drawerView) {
if(drawerView==leftMenuPanel)
{
super.onDrawerClosed(drawerView);
}
getSupportActionBar().setTitle(R.string.app_name);
postInvalidateOptionsMenu();
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if(drawerView==rightMenuPanel)
{
super.onDrawerClosed(drawerView);
}
getSupportActionBar().setTitle(R.string.action_toggle);
postInvalidateOptionsMenu();
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
if(drawerView==rightMenuPanel)
{
super.onDrawerClosed(drawerView);
}
}
@Override
public void onDrawerStateChanged(int newState) {
super.onDrawerStateChanged(newState);
}
};
getSupportActionBar().setDisplayHomeAsUpEnabled(true);//给home icon的左边加上一个返回的图标
getSupportActionBar().setIcon(new ColorDrawable(0x00ffffff));
mDrawerLayout.setDrawerListener(actionBarDrawerToggle);
actionBarDrawerToggle.setDrawerIndicatorEnabled(true);
}
private void postInvalidateOptionsMenu()
{
try {
Method method = this.getClass().getMethod("invalidateOptionsMenu", new Class<?>[]{});
if(method!=null)
{
if (Modifier.isPublic(method.getModifiers()) &&
Modifier.isPublic(method.getDeclaringClass().getModifiers())) {
method.invoke(this, new Object[]{});
}
else if(!method.isAccessible())
{
method.setAccessible(true);
method.invoke(this, new Object[]{});
}
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
private void forceShowOverflowMenu() {
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toggle_menu, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content view
boolean drawerOpen = mDrawerLayout.isDrawerOpen(leftMenuPanel) || mDrawerLayout.isDrawerOpen(rightMenuPanel);
menu.findItem(R.id.action_search).setVisible(!drawerOpen);//search的显示与drawer的显示相反
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (actionBarDrawerToggle.onOptionsItemSelected(item))
{
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onMenuOpened(int featureId, Menu menu)
{
if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {
if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
try {
Method m = menu.getClass().getDeclaredMethod(
"setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
} catch (Exception e) {
}
}
}
return super.onMenuOpened(featureId, menu);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
actionBarDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
actionBarDrawerToggle.onConfigurationChanged(newConfig);
}
}
Android getActionBar vs getSupportActionBar?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){ //android.support.v7.app.ActionBar actionBar = getSupportActionBar(); //actionBar.setTitle("Android"); ActionBar actionBar = getActionBar(); actionBar.setTitle("Droid"); }
在使用getSupportActionBar()时,我的应用程序与kitkat和其他新版本运行良好,但使用getActionBar导致错误.
这是错误:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.hide()' on a null object reference at com.github.domain.geoquiz.QuizActivity.onCreate(QuizActivity.java:57) at android.app.Activity.performCreate(Activity.java:5933) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2251) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) at android.app.ActivityThread.access$800(ActivityThread.java:144) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372
为什么?来自android文档:
Caution: Be certain you import the ActionBar class (and related APIs)
from the appropriate package:If supporting API levels lower than 11:
import android.support.v7.app.ActionBarIf supporting only API level
11 and higher: import android.app.ActionBar
现在为什么这个应用程序崩溃了?
解决方法
您定位的是哪个Android版本?
我建议你使用新的Toolbar而不是ActionBar,因为它的使用方式更灵活.
android – DrawerLayout和ActionBarDrawerToggle无法解析为某个类型
DrawerLayout cannot be resolved to a type ActionBarDrawerToggle cannot be resolved to a type
我的进口是:
import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.MenuItem;
解决方法
import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout;
检查一下
http://developer.android.com/tools/support-library/index.html
有关NaigationDrawer的更多信息
http://developer.android.com/training/implementing-navigation/nav-drawer.html
android – NavigationView和ActionBarDrawerToggle
解决方法
With the new
NavigationView
is it still recommended to useActionBarDrawerToggle
不,这不是必需的.
如果您查看新设计库的“官方”demo code,则不再使用ActionBarDrawerToggle,因为新的NavigationView和AppCompatActivity不需要它.
使用新的v22支持库,您可以删除所有的ActionBarDrawerToggle代码,只需使用以下操作来处理NavigationDrawer与ActionBar / ToolBar汉堡包图标之间的交互:
@Override protected void onCreate(Bundle savedInstanceState) { ... final ActionBar actionBar = getSupportActionBar(); actionBar.setHomeAsUpIndicator(R.drawable.ic_menu); actionBar.setdisplayHomeAsUpEnabled(true); ... } @Override public boolean onoptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: mDrawerLayout.openDrawer(GravityCompat.START); return true; .... } return super.onoptionsItemSelected(item); }
您将需要提供自己的“汉堡包”drawable(在我的例子中为R.drawable.ic_menu).此外,上述代码是处理抽屉开启所需的所有代码. onoptionsItemSelected()中的android.R.id.home案例表示您的汉堡包抽屉按钮.它指向一个内置的资源ID(不是您添加到菜单xml的东西),它会自动处理.
此外,您必须通过简单地向您的点击监听器添加closeDrawers()来实现关闭抽屉,如下所示:
navigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { // Handle menu item clicks here. drawerLayout.closeDrawers(); return true; } });
closeDrawers()是DrawerLayout的一种方法,并且处理所有内容.而已.这就是您真正需要正确处理导航抽屉的代码.没有更多凌乱的代码来翻转汉堡包等!
当然,如果你真的想,你仍然可以使用NavigationView与ActionBarDrawerToggle的旧方法.但你当然不必.
如果你想要抽屉回调
即使ActionBarDrawerToggle不需要打开/关闭抽屉,它可能仍然有助于处理额外的回调(特别是如果您已经使用ActionBar).否则,您可以使用DrawerLayout.DrawerListener或使用DrawerLayout.SimpleDrawerListener()来实现自己的,来处理其他打开/关闭相关事件.
我们今天的关于ActionBarDrawerToggle无法应用于Android.support.v7.widget.Toolbar和无法应用于所选区域的分享已经告一段落,感谢您的关注,如果您想了解更多关于Androi ActionBarDrawerToggle&DrawerLayout 双向侧滑动、Android getActionBar vs getSupportActionBar?、android – DrawerLayout和ActionBarDrawerToggle无法解析为某个类型、android – NavigationView和ActionBarDrawerToggle的相关信息,请在本站查询。
本文标签: