GVKun编程网logo

ActionBarDrawerToggle无法应用于Android.support.v7.widget.Toolbar(无法应用于所选区域)

14

这篇文章主要围绕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(无法应用于所选区域)

ActionBarDrawerToggle无法应用于Android.support.v7.widget.Toolbar(无法应用于所选区域)

我一直收到错误,说ActionBarDrawerToggle无法应用于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.我该如何解决?

解决方法

ActionBarDrawerToggle构造函数如下.
android.support.v7.app.ActionBarDrawerToggle.ActionBarDrawerToggle(Activity activity,DrawerLayout drawerLayout,Toolbar toolbar,int openDrawerContentDescRes,int closeDrawerContentDescRes)

您正在传递R.drawable.ic_drawer drawable而不是工具栏,这就是您收到此错误的原因.

创建工具栏并将其添加为操作栏,并将此工具栏传递给此构造函数.

Androi ActionBarDrawerToggle&DrawerLayout 双向侧滑动

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(thisnew Object[]{});
	            }
	            else if(!method.isAccessible())
            	{
            		method.setAccessible(true);
            		method.invoke(thisnew 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?

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.ActionBar

If supporting only API level
11 and higher: import android.app.ActionBar

现在为什么这个应用程序崩溃了?

解决方法

如果您正在使用AppCompat,无论您的应用程序运行的是哪个Android版本,您都必须调用getSupportActionBar().

您定位的是哪个Android版本?

我建议你使用新的Toolbar而不是ActionBar,因为它的使用方式更灵活.

android – DrawerLayout和ActionBarDrawerToggle无法解析为某个类型

android – DrawerLayout和ActionBarDrawerToggle无法解析为某个类型

我想在我的应用程序中实现ActionBarSherlock侧面菜单导航抽屉,但总是得到:

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

使用新的NavigationView仍然建议使用ActionBarDrawerToggle或者这不是“材质设计”?例如,以前我们应该在抽屉开放时隐藏动作栏项目,但是现在的指导方针说他们应该留下来.

解决方法

With the new NavigationView is it still recommended to use ActionBarDrawerToggle

不,这不是必需的.

如果您查看新设计库的“官方”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的相关信息,请在本站查询。

本文标签: