我正在使用 Material Navigation Drawer,我想做的是:
- 在抽屉导航中有一个标题(带有应用程序图标的背景)。
- 标题下的部分。
- 部分名称下的可导航 fragment 。
我的问题:
- 标题根本没有显示。
- 抽屉导航不在顶部,它就像一个普通的抽屉导航。
- 第一部分重复,为了更简单,它的第一个实例在滚动时保持在原位,第二个(重复)根据滚动移动。
代码:
适配器(它的样本):
public class NavDrawerAdapter extends
RecyclerView.Adapter<NavDrawerAdapter.ViewHolder> {
private List<NavItem> mData;
private NavDrawerCallback mNavDrawerCallbacks;
private NavDrawerFragment mContext;
public NavDrawerAdapter(List<NavItem> data, NavDrawerFragment context) {
mData = data;
mContext = context;
}
@Override
public NavDrawerAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup,
int i) {
if (i == 0) {
return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.drawer_top, viewGroup, false));
} else if (i == 1) {
return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.drawer_section, viewGroup, false));
}
View v = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.drawer_row, viewGroup, false);
return new ViewHolder(v);
}
@Override
public int getItemViewType(int position) {
if (mData.get(position).getType() == NavItem.TOP){
return 0;
} else if (mData.get(position).getType() == NavItem.SECTION) {
return 1;
} else {
return 2;
}
}
导航 fragment :
public class NavDrawerFragment extends Fragment implements NavDrawerCallback {
private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
private NavDrawerCallback mCallbacks;
private RecyclerView mDrawerList;
private View mFragmentContainerView;
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mActionBarDrawerToggle;
private int mCurrentSelectedPosition;
private List<NavItem> mConfiguration;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view;
view = inflater.inflate(R.layout.drawer_fragment, container, false);
mDrawerList = (RecyclerView) view.findViewById(R.id.drawerList);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mDrawerList.setLayoutManager(layoutManager);
mDrawerList.setHasFixedSize(true);
final List<NavItem> NavItems = getConfiguration();
NavDrawerAdapter adapter = new NavDrawerAdapter(NavItems, NavDrawerFragment.this);
adapter.setNavigationDrawerCallbacks(this);
mDrawerList.setAdapter(adapter);
selectItem(mCurrentSelectedPosition, NavItems.get(mCurrentSelectedPosition));
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallbacks = (NavDrawerCallback) activity;
} catch (ClassCastException e) {
throw new ClassCastException("Activity must implement NavDrawerCallback.");
}
}
public ActionBarDrawerToggle getActionBarDrawerToggle() {
return mActionBarDrawerToggle;
}
public void setActionBarDrawerToggle(ActionBarDrawerToggle actionBarDrawerToggle) {
mActionBarDrawerToggle = actionBarDrawerToggle;
}
public void setup(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
mFragmentContainerView = getActivity().findViewById(fragmentId);
mDrawerLayout = drawerLayout;
mActionBarDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close) {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) return;
getActivity().invalidateOptionsMenu();
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!isAdded()) return;
getActivity().invalidateOptionsMenu();
}
};
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mActionBarDrawerToggle.syncState();
}
});
mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
//TODO This works (hides the drawer if there is only 1 item), but makes settings and favorites unreachable
boolean newDrawer = getResources().getBoolean(R.bool.newdrawer);
if (newDrawer == false && getConfiguration().size() == 1){
mActionBarDrawerToggle.setDrawerIndicatorEnabled(false);
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
if (newDrawer == true && getConfiguration().size() == 2){
mActionBarDrawerToggle.setDrawerIndicatorEnabled(false);
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
}
public void openDrawer() {
mDrawerLayout.openDrawer(mFragmentContainerView);
}
public void closeDrawer() {
mDrawerLayout.closeDrawer(mFragmentContainerView);
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
void selectItem(int position, NavItem item) {
//If on start, item is section, change it.
if (item.getType() == NavItem.SECTION || item.getType() == NavItem.TOP){
position = position + 1;
item = getConfiguration().get(position);
selectItem(position, item);
return;
}
mCurrentSelectedPosition = position;
if (mDrawerLayout != null) {
mDrawerLayout.closeDrawer(mFragmentContainerView);
}
if (mCallbacks != null) {
mCallbacks.onNavigationDrawerItemSelected(position, item);
}
((NavDrawerAdapter) mDrawerList.getAdapter()).selectPosition(position);
}
public boolean isDrawerOpen() {
return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mActionBarDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
}
@Override
public void onNavigationDrawerItemSelected(int position, NavItem item) {
//TODO we can also call this method here, but that won't set an initial item.
//mCallbacks.onNavigationDrawerItemSelected(position, item);
if (item.getType() != NavItem.SECTION){
selectItem(position, item);
}
}
public DrawerLayout getDrawerLayout() {
return mDrawerLayout;
}
public void setDrawerLayout(DrawerLayout drawerLayout) {
mDrawerLayout = drawerLayout;
}
private List<NavItem> getConfiguration(){
if (null == mConfiguration){
mConfiguration = Config.configuration();
boolean newDrawer = getResources().getBoolean(R.bool.newdrawer);
if (newDrawer == true){
mConfiguration.add(0, new NavItem("Header", NavItem.TOP));
}
}
return mConfiguration;
}
}
样式:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
<item name="windowActionModeOverlay">true</item>
<item name="android:textColor">@color/black</item>
<item name="android:windowBackground">@color/myWindowBackground</item>
</style>
<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
<item name="spinBars">true</item>
<item name="color">@android:color/white</item>
</style>
抽屉 fragment xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
android:id="@+id/drawerList"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:clickable="true"
android:focusableInTouchMode="true"
android:scrollbars="vertical"
android:focusable="true"
android:layout_height="match_parent"
android:background="@color/myDrawerBackground"/>
抽屉部分 Xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<View
android:layout_width="fill_parent"
android:layout_height="0.5dp"
android:background="@color/light_gray" />
<TextView
android:id="@+id/section_name"
android:textAllCaps="false"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:layout_marginEnd="16dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="10dp"
android:drawablePadding="16dp"
android:gravity="center_vertical"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
android:textColor="@color/dim_gray"
android:textSize="14sp" />
</LinearLayout>
抽屉顶部:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:src="@drawable/drawer_header"
android:adjustViewBounds="true"
android:maxHeight="195dp"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView1"
android:gravity="center"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:background="@drawable/drawer_top_gradient"
android:paddingLeft="20dp"
android:paddingTop="20dp"
android:paddingBottom="10dp"
android:paddingRight="10dp"
android:text="@string/app_name"
android:textSize="22sp"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:textColor="@color/white"
android:paddingStart="20dp"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true"
android:paddingEnd="10dp" />
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
最佳答案
已解决,通过从头开始构建项目。
关于android - 抽屉导航错误 : Not Being On Top, 标题未显示,第一部分重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35780232/