Android 没有操作栏的导航抽屉
Android navigation drawer without actionbar
我在 Android Studio 上创建了导航抽屉 activity,但我的主题没有 ActionBar(由于设计原因,我正在使用 Toolbar
小部件),并且它拒绝工作,在这里给我一个 java.lang.NullPointerException
点:
mDrawerListView.setAdapter(new ArrayAdapter<String>(
getActionBar().getThemedContext(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1,
new String[]{
getString(R.string.title_section1),
getString(R.string.title_section2),
getString(R.string.title_section3),
}));
所以我尝试用其他上下文 getter 函数替换 getActionBar().getThemedContext()
,但没有成功...
编辑: 根据要求:
堆栈跟踪:
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: FATAL EXCEPTION: main
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{br.net.beno.supercarrinho/br.net.beno.supercarrinho.AtividadePrincipal}: android.view.InflateException: Binary XML file line #19: Error inflating class fragment
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2255)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2309)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:157)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:176)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5319)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #19: Error inflating class fragment
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:255)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at br.net.beno.supercarrinho.AtividadePrincipal.onCreate(AtividadePrincipal.java:52)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.Activity.performCreate(Activity.java:5326)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2218)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2309)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:157)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:176)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5319)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: Caused by: java.lang.NullPointerException
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at br.net.beno.supercarrinho.NavigationDrawerFragment.onCreateView(NavigationDrawerFragment.java:100)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:995)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1185)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1287)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2243)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:278)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:78)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:686)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:255)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at br.net.beno.supercarrinho.AtividadePrincipal.onCreate(AtividadePrincipal.java:52)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.Activity.performCreate(Activity.java:5326)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2218)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2309)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:157)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:176)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5319)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
NavigationDrawerFragment.java:
package br.net.beno.supercarrinho;
import android.support.v7.app.AppCompatActivity;
import android.app.Activity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.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.support.v7.widget.Toolbar;
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;
/**
* Fragment used for managing interactions for and presentation of a navigation drawer.
* See the <a href="https://developer.android.com/design/patterns/navigation-drawer.html#Interaction">
* design guidelines</a> for a complete explanation of the behaviors implemented here.
*/
public class NavigationDrawerFragment extends Fragment {
/**
* Remember the position of the selected item.
*/
private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
/**
* Per the design guidelines, you should show the drawer on launch until the user manually
* expands it. This shared preference tracks this.
*/
private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";
/**
* A pointer to the current callbacks instance (the Activity).
*/
private NavigationDrawerCallbacks mCallbacks;
/**
* Helper component that ties the action bar to the navigation drawer.
*/
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
private ListView mDrawerListView;
private View mFragmentContainerView;
private int mCurrentSelectedPosition = 0;
private boolean mFromSavedInstanceState;
private boolean mUserLearnedDrawer;
public NavigationDrawerFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Read in the flag indicating whether or not the user has demonstrated awareness of the
// drawer. See PREF_USER_LEARNED_DRAWER for details.
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);
if (savedInstanceState != null) {
mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
mFromSavedInstanceState = true;
}
// Select either the default item (0) or the last selected item.
selectItem(mCurrentSelectedPosition);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Indicate that this fragment would like to influence the set of actions in the action bar.
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mDrawerListView = (ListView) inflater.inflate(
R.layout.fragment_navigation_drawer, container, false);
mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
});
mDrawerListView.setAdapter(new ArrayAdapter<String>(
getActionBar().getThemedContext(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1,
new String[]{
getString(R.string.title_section1),
getString(R.string.title_section2),
getString(R.string.title_section3),
}));
mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
return mDrawerListView;
}
public boolean isDrawerOpen() {
return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView);
}
/**
* Users of this fragment must call this method to set up the navigation drawer interactions.
*
* @param fragmentId The android:id of this fragment in its activity's layout.
* @param drawerLayout The DrawerLayout containing this fragment's UI.
*/
public void setUp(int fragmentId, DrawerLayout drawerLayout) {
mFragmentContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view with items and click listener
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the navigation drawer and the action bar app icon.
mDrawerToggle = new 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 */
) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) {
return;
}
getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!isAdded()) {
return;
}
if (!mUserLearnedDrawer) {
// The user manually opened the drawer; store this flag to prevent auto-showing
// the navigation drawer automatically in the future.
mUserLearnedDrawer = true;
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
}
getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
};
// If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
// per the navigation drawer design guidelines.
if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
mDrawerLayout.openDrawer(mFragmentContainerView);
}
// Defer code dependent on restoration of previous instance state.
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
private void selectItem(int position) {
mCurrentSelectedPosition = position;
if (mDrawerListView != null) {
mDrawerListView.setItemChecked(position, true);
}
if (mDrawerLayout != null) {
mDrawerLayout.closeDrawer(mFragmentContainerView);
}
if (mCallbacks != null) {
mCallbacks.onNavigationDrawerItemSelected(position);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallbacks = (NavigationDrawerCallbacks) activity;
} catch (ClassCastException e) {
throw new ClassCastException("Activity must implement NavigationDrawerCallbacks.");
}
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Forward the new configuration the drawer toggle component.
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// If the drawer is open, show the global app actions in the action bar. See also
// showGlobalContextActionBar, which controls the top-left area of the action bar.
if (mDrawerLayout != null && isDrawerOpen()) {
inflater.inflate(R.menu.global, menu);
showGlobalContextActionBar();
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
if (item.getItemId() == R.id.action_example) {
Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* Per the navigation drawer design guidelines, updates the action bar to show the global app
* 'context', rather than just what's in the current screen.
*/
private void showGlobalContextActionBar() {
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setTitle(R.string.app_name);
}
private ActionBar getActionBar() {
return ((AppCompatActivity) getActivity()).getSupportActionBar();
}
/**
* Callbacks interface that all activities using this fragment must implement.
*/
public static interface NavigationDrawerCallbacks {
/**
* Called when an item in the navigation drawer is selected.
*/
void onNavigationDrawerItemSelected(int position);
}
}
编辑 2:
AtividadePrincipal.java
package br.net.beno.supercarrinho;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import br.net.beno.supercarrinho.R;
import com.digits.sdk.android.Digits;
import com.twitter.sdk.android.Twitter;
import com.twitter.sdk.android.core.TwitterAuthConfig;
import com.twitter.sdk.android.core.TwitterCore;
import io.fabric.sdk.android.Fabric;
public class AtividadePrincipal extends AppCompatActivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {
// Note: Your consumer key and secret should be obfuscated in your source code before shipping.
private static final String TWITTER_KEY = "Dwt1PeE72Ht0znFw1WjVD7ym3";
private static final String TWITTER_SECRET = "NjxKx3fSfVI5DJ1xcuC5Eqy7AMPaJV5K1kzsCPYIdmxXWeNfoI";
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
private NavigationDrawerFragment mNavigationDrawerFragment;
/**
* Used to store the last screen title. For use in {@link #restoreActionBar()}.
*/
private CharSequence mTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
Fabric.with(this, new Digits(), new Twitter(authConfig));
setContentView(R.layout.activity_atividade_principal);
// Trocando a actionbar pela toolbar
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
// Gaveta de navegacao
mNavigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, FragmentoListaCompras.newInstance(position + 1))
.commit();
}
public void onSectionAttached(int number) {
switch (number) {
case 1:
mTitle = getString(R.string.title_section1);
break;
case 2:
mTitle = getString(R.string.title_section2);
break;
case 3:
mTitle = getString(R.string.title_section3);
break;
}
}
public void restoreActionBar() {
ActionBar actionBar = getSupportActionBar();
// actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(mTitle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!mNavigationDrawerFragment.isDrawerOpen()) {
// Only show items in the action bar relevant to this screen
// if the drawer is not showing. Otherwise, let the drawer
// decide what to show in the action bar.
getMenuInflater().inflate(R.menu.atividade_principal, menu);
restoreActionBar();
return true;
}
return super.onCreateOptionsMenu(menu);
}
@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.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
编辑 3:
activity_atividade_principal.xml:
<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context="br.net.beno.supercarrinho.AtividadePrincipal">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_height="128dp"
android:layout_width="match_parent"
android:minHeight="?android:attr/actionBarSize"
android:background="@color/colorPrimary"
android:gravity="bottom" />
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout android:id="@+id/container" android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
If you're not building against API 17 or higher, use
android:layout_gravity="left" instead. -->
<!-- The drawer is given a fixed width in dp and extends the full height of
the container. -->
<fragment android:id="@+id/navigation_drawer"
android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent"
android:layout_gravity="start"
android:name="br.net.beno.supercarrinho.NavigationDrawerFragment"
tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>
如果您还需要什么,请询问。 :)
在调用 getActionBar()
或 getSupportActionbar()
之前,您应该将 Toolbar
设置为 ActionBar
。
您是否已经在 Fragment
的 onCreateView
之前将 Toolbar
设置为 Activity
的 onCreate
中的 ActionBar
叫什么?
Toolbar toolbar = (Toolbar) findViewById(R.id.your_toolbar_id);
setSupportActionBar(toolbar);
// setActionBar(toolbar); // if you are not using AppCompatActivity
编辑:
NavigationDrawerFragment's onCreateView is called first...
那么你可以移动这些行:
// Trocando a actionbar pela toolbar
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
到片段:
private ActionBar getActionBar() {
AppCompatActivity activity = (AppCompatActivity) getActivity();
Toolbar mToolbar = (Toolbar) activity.findViewById(R.id.toolbar);
activity.setSupportActionBar(mToolbar);
return activity.getSupportActionBar();
}
上面的代码可能还有一些错误,但是在这个顺序中 ActionBar
不会为空。
((AppCompatActivity)getActivity()).getSupportActionBar()
操作栏是 activity 的一部分,而不是片段。观察您访问操作栏的片段 class 中的每一行。此外,当您为 activity 扩展 AppCompatActivity 时,您必须使用 getSupportActionBar。
据我了解,android.support.v4.widget.DrawerLayout 应该只有两个子项:主要内容和导航视图。我认为那里的工具栏是错误的。
好吧,感谢这里的一些评论和回复,以及一些额外的研究,我能够启用它。
如user5195185 pointed out, it seems like the DrawerLayout
must have only two children: The content (the view where it will attach whatever content you put), and the drawer (the ListView
). After some search on Github, I got this code.
所以我将我的 Toolbar
小部件与默认 FrameLayout
放在 LinearLayout
中,但我仍然遇到相同的 NullPointer 错误...
然后我检查了它的代码,我发现他们传递了主要的 activity 作为上下文,所以我使用 getActivity()
而不是 getActionBar().getThemedContext()
作为上下文,它起作用了!
之后,我发现this reply,让bar保持在ListView之上,我就设置好了。
所以,我不知道这是否会导致未来出现问题,但这似乎是让工具栏和导航抽屉协同工作的正确方法。
我在 Android Studio 上创建了导航抽屉 activity,但我的主题没有 ActionBar(由于设计原因,我正在使用 Toolbar
小部件),并且它拒绝工作,在这里给我一个 java.lang.NullPointerException
点:
mDrawerListView.setAdapter(new ArrayAdapter<String>(
getActionBar().getThemedContext(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1,
new String[]{
getString(R.string.title_section1),
getString(R.string.title_section2),
getString(R.string.title_section3),
}));
所以我尝试用其他上下文 getter 函数替换 getActionBar().getThemedContext()
,但没有成功...
编辑: 根据要求: 堆栈跟踪:
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: FATAL EXCEPTION: main
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{br.net.beno.supercarrinho/br.net.beno.supercarrinho.AtividadePrincipal}: android.view.InflateException: Binary XML file line #19: Error inflating class fragment
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2255)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2309)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:157)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:176)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5319)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #19: Error inflating class fragment
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:255)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at br.net.beno.supercarrinho.AtividadePrincipal.onCreate(AtividadePrincipal.java:52)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.Activity.performCreate(Activity.java:5326)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2218)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2309)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:157)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:176)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5319)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: Caused by: java.lang.NullPointerException
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at br.net.beno.supercarrinho.NavigationDrawerFragment.onCreateView(NavigationDrawerFragment.java:100)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:995)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1185)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1287)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2243)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:278)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:78)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:686)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.rInflate(LayoutInflater.java:752)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:255)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at br.net.beno.supercarrinho.AtividadePrincipal.onCreate(AtividadePrincipal.java:52)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.Activity.performCreate(Activity.java:5326)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2218)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2309)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:157)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:176)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5319)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:511)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
10-13 15:15:16.054 15849-15849/? E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
NavigationDrawerFragment.java:
package br.net.beno.supercarrinho;
import android.support.v7.app.AppCompatActivity;
import android.app.Activity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.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.support.v7.widget.Toolbar;
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;
/**
* Fragment used for managing interactions for and presentation of a navigation drawer.
* See the <a href="https://developer.android.com/design/patterns/navigation-drawer.html#Interaction">
* design guidelines</a> for a complete explanation of the behaviors implemented here.
*/
public class NavigationDrawerFragment extends Fragment {
/**
* Remember the position of the selected item.
*/
private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
/**
* Per the design guidelines, you should show the drawer on launch until the user manually
* expands it. This shared preference tracks this.
*/
private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";
/**
* A pointer to the current callbacks instance (the Activity).
*/
private NavigationDrawerCallbacks mCallbacks;
/**
* Helper component that ties the action bar to the navigation drawer.
*/
private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
private ListView mDrawerListView;
private View mFragmentContainerView;
private int mCurrentSelectedPosition = 0;
private boolean mFromSavedInstanceState;
private boolean mUserLearnedDrawer;
public NavigationDrawerFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Read in the flag indicating whether or not the user has demonstrated awareness of the
// drawer. See PREF_USER_LEARNED_DRAWER for details.
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);
if (savedInstanceState != null) {
mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
mFromSavedInstanceState = true;
}
// Select either the default item (0) or the last selected item.
selectItem(mCurrentSelectedPosition);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Indicate that this fragment would like to influence the set of actions in the action bar.
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mDrawerListView = (ListView) inflater.inflate(
R.layout.fragment_navigation_drawer, container, false);
mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
});
mDrawerListView.setAdapter(new ArrayAdapter<String>(
getActionBar().getThemedContext(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1,
new String[]{
getString(R.string.title_section1),
getString(R.string.title_section2),
getString(R.string.title_section3),
}));
mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
return mDrawerListView;
}
public boolean isDrawerOpen() {
return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView);
}
/**
* Users of this fragment must call this method to set up the navigation drawer interactions.
*
* @param fragmentId The android:id of this fragment in its activity's layout.
* @param drawerLayout The DrawerLayout containing this fragment's UI.
*/
public void setUp(int fragmentId, DrawerLayout drawerLayout) {
mFragmentContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view with items and click listener
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the navigation drawer and the action bar app icon.
mDrawerToggle = new 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 */
) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) {
return;
}
getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!isAdded()) {
return;
}
if (!mUserLearnedDrawer) {
// The user manually opened the drawer; store this flag to prevent auto-showing
// the navigation drawer automatically in the future.
mUserLearnedDrawer = true;
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
}
getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
};
// If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
// per the navigation drawer design guidelines.
if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
mDrawerLayout.openDrawer(mFragmentContainerView);
}
// Defer code dependent on restoration of previous instance state.
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
private void selectItem(int position) {
mCurrentSelectedPosition = position;
if (mDrawerListView != null) {
mDrawerListView.setItemChecked(position, true);
}
if (mDrawerLayout != null) {
mDrawerLayout.closeDrawer(mFragmentContainerView);
}
if (mCallbacks != null) {
mCallbacks.onNavigationDrawerItemSelected(position);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallbacks = (NavigationDrawerCallbacks) activity;
} catch (ClassCastException e) {
throw new ClassCastException("Activity must implement NavigationDrawerCallbacks.");
}
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Forward the new configuration the drawer toggle component.
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// If the drawer is open, show the global app actions in the action bar. See also
// showGlobalContextActionBar, which controls the top-left area of the action bar.
if (mDrawerLayout != null && isDrawerOpen()) {
inflater.inflate(R.menu.global, menu);
showGlobalContextActionBar();
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
if (item.getItemId() == R.id.action_example) {
Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* Per the navigation drawer design guidelines, updates the action bar to show the global app
* 'context', rather than just what's in the current screen.
*/
private void showGlobalContextActionBar() {
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setTitle(R.string.app_name);
}
private ActionBar getActionBar() {
return ((AppCompatActivity) getActivity()).getSupportActionBar();
}
/**
* Callbacks interface that all activities using this fragment must implement.
*/
public static interface NavigationDrawerCallbacks {
/**
* Called when an item in the navigation drawer is selected.
*/
void onNavigationDrawerItemSelected(int position);
}
}
编辑 2:
AtividadePrincipal.java
package br.net.beno.supercarrinho;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.support.v4.widget.DrawerLayout;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import br.net.beno.supercarrinho.R;
import com.digits.sdk.android.Digits;
import com.twitter.sdk.android.Twitter;
import com.twitter.sdk.android.core.TwitterAuthConfig;
import com.twitter.sdk.android.core.TwitterCore;
import io.fabric.sdk.android.Fabric;
public class AtividadePrincipal extends AppCompatActivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {
// Note: Your consumer key and secret should be obfuscated in your source code before shipping.
private static final String TWITTER_KEY = "Dwt1PeE72Ht0znFw1WjVD7ym3";
private static final String TWITTER_SECRET = "NjxKx3fSfVI5DJ1xcuC5Eqy7AMPaJV5K1kzsCPYIdmxXWeNfoI";
/**
* Fragment managing the behaviors, interactions and presentation of the navigation drawer.
*/
private NavigationDrawerFragment mNavigationDrawerFragment;
/**
* Used to store the last screen title. For use in {@link #restoreActionBar()}.
*/
private CharSequence mTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
Fabric.with(this, new Digits(), new Twitter(authConfig));
setContentView(R.layout.activity_atividade_principal);
// Trocando a actionbar pela toolbar
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
// Gaveta de navegacao
mNavigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, FragmentoListaCompras.newInstance(position + 1))
.commit();
}
public void onSectionAttached(int number) {
switch (number) {
case 1:
mTitle = getString(R.string.title_section1);
break;
case 2:
mTitle = getString(R.string.title_section2);
break;
case 3:
mTitle = getString(R.string.title_section3);
break;
}
}
public void restoreActionBar() {
ActionBar actionBar = getSupportActionBar();
// actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(mTitle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (!mNavigationDrawerFragment.isDrawerOpen()) {
// Only show items in the action bar relevant to this screen
// if the drawer is not showing. Otherwise, let the drawer
// decide what to show in the action bar.
getMenuInflater().inflate(R.menu.atividade_principal, menu);
restoreActionBar();
return true;
}
return super.onCreateOptionsMenu(menu);
}
@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.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
编辑 3:
activity_atividade_principal.xml:
<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context="br.net.beno.supercarrinho.AtividadePrincipal">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_height="128dp"
android:layout_width="match_parent"
android:minHeight="?android:attr/actionBarSize"
android:background="@color/colorPrimary"
android:gravity="bottom" />
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout android:id="@+id/container" android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
If you're not building against API 17 or higher, use
android:layout_gravity="left" instead. -->
<!-- The drawer is given a fixed width in dp and extends the full height of
the container. -->
<fragment android:id="@+id/navigation_drawer"
android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent"
android:layout_gravity="start"
android:name="br.net.beno.supercarrinho.NavigationDrawerFragment"
tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>
如果您还需要什么,请询问。 :)
在调用 getActionBar()
或 getSupportActionbar()
之前,您应该将 Toolbar
设置为 ActionBar
。
您是否已经在 Fragment
的 onCreateView
之前将 Toolbar
设置为 Activity
的 onCreate
中的 ActionBar
叫什么?
Toolbar toolbar = (Toolbar) findViewById(R.id.your_toolbar_id);
setSupportActionBar(toolbar);
// setActionBar(toolbar); // if you are not using AppCompatActivity
编辑:
NavigationDrawerFragment's onCreateView is called first...
那么你可以移动这些行:
// Trocando a actionbar pela toolbar
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
到片段:
private ActionBar getActionBar() {
AppCompatActivity activity = (AppCompatActivity) getActivity();
Toolbar mToolbar = (Toolbar) activity.findViewById(R.id.toolbar);
activity.setSupportActionBar(mToolbar);
return activity.getSupportActionBar();
}
上面的代码可能还有一些错误,但是在这个顺序中 ActionBar
不会为空。
((AppCompatActivity)getActivity()).getSupportActionBar() 操作栏是 activity 的一部分,而不是片段。观察您访问操作栏的片段 class 中的每一行。此外,当您为 activity 扩展 AppCompatActivity 时,您必须使用 getSupportActionBar。
据我了解,android.support.v4.widget.DrawerLayout 应该只有两个子项:主要内容和导航视图。我认为那里的工具栏是错误的。
好吧,感谢这里的一些评论和回复,以及一些额外的研究,我能够启用它。
如user5195185 pointed out, it seems like the DrawerLayout
must have only two children: The content (the view where it will attach whatever content you put), and the drawer (the ListView
). After some search on Github, I got this code.
所以我将我的 Toolbar
小部件与默认 FrameLayout
放在 LinearLayout
中,但我仍然遇到相同的 NullPointer 错误...
然后我检查了它的代码,我发现他们传递了主要的 activity 作为上下文,所以我使用 getActivity()
而不是 getActionBar().getThemedContext()
作为上下文,它起作用了!
之后,我发现this reply,让bar保持在ListView之上,我就设置好了。
所以,我不知道这是否会导致未来出现问题,但这似乎是让工具栏和导航抽屉协同工作的正确方法。