【问题标题】:Navigation Drawer Bugs : Not Being On Top, Header Isn't Showing, First Section Is Repeated导航抽屉错误:不在顶部,标题不显示,第一部分重复
【发布时间】:2016-03-03 18:35:58
【问题描述】:

我正在使用材质导航抽屉,我想做的是以下内容:

  1. 在导航抽屉中有一个标题(带有应用图标的背景)。
  2. 标题下的部分。
  3. 部分名称下的可导航片段。

我的问题:

  1. 标题根本不显示。
  2. 导航抽屉不在顶部,它就像一个普通的导航抽屉。
  3. 第一部分被重复,为了更简化,它的第一个实例在滚动时保持原位,第二个(重复)根据滚动移动。

代码:

适配器(示例):

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;
    }
}

导航片段:

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>

抽屉片段 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 android-fragments navigation-drawer


    【解决方案1】:

    解决了,从头开始构建项目。

    【讨论】:

    • 你已经做到了很好。但这不是重建整个项目的解决方案。我们应该学会指出错误并解决它们。thanx :)
    • 我知道这不是一个解决方案,但是在挖掘并检查了问题之后?我完全没发现问题,代码是正确的,所以我只是重新下载了示例并修改了它。
    猜你喜欢
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多