3

我尝试从支持库 13 中实现最新的抽屉布局。使用以下代码,抽屉始终显示在 gridview 下方。即使我尝试调用 bringToFront() 仍然无法正常工作。能帮忙找出问题所在吗?谢谢。

activity_main.xml

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
</android.support.v4.widget.DrawerLayout>

member_home_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <GridView
        android:id="@+id/member_home_thumbnail_grid"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnWidth="90dp"
        android:gravity="center"
        android:horizontalSpacing="0dp"
        android:numColumns="auto_fit"
        android:stretchMode="columnWidth"
        android:verticalSpacing="0dp" >
    </GridView>
</LinearLayout> 

主要活动:

public class BaseRootActivity extends BaseActivity {
    private DrawerLayout                    mDrawerLayout;
    private ListView                            mDrawerList;
    private ActionBarDrawerToggle   mDrawerToggle;
    private String[]                            mMainMenus;

    public ListView getDrawerListView() {
        return this.mDrawerList;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mMainMenus = this.getResources().getStringArray(R.array.main_menu_array);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) this.findViewById(R.id.left_drawer);

        // set up the drawer's list view with items and click listener
        mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mMainMenus));

        // enable ActionBar app icon to behave as action to toggle nav drawer
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        // ActionBarDrawerToggle ties together the the proper interactions
        // between the sliding drawer and the action bar app icon
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle("actionbar title");
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle("drawer title");
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    }
...

在主要片段中

public class MemberHomeFragment extends Fragment implements OnItemClickListener {

    private GridView                            mGridListView;
    private UserThumbnailAdapter    memberAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.member_home_layout, container, false);

        mGridListView = (GridView) rootView.findViewById(R.id.member_home_thumbnail_grid);
        mGridListView.setOnItemClickListener(this);

        memberAdapter = new UserThumbnailAdapter(this.getActivity(), null);
        mGridListView.setAdapter(memberAdapter);

        this.startLoading(); // load thumbnails

        return rootView;
    }
4

2 回答 2

2

因此,正如我之前提到的,这与您使用抽屉布局的方式无关。这是您使用片段的方式的问题。FragmentManager 的工作方式是创建一个片段事务,然后告诉片段事务一组工作,然后提交它,这样所有事情都会立即发生。

当您添加、删除或在您的情况下替换一个片段时,您必须告诉 FragmentManager 将您的片段放在哪里,而您给了它错误的位置。你告诉它把你的片段放在 android.R.id.content 里面,屏幕上的所有内容都在里面。您只想将片段添加到您自己的容器中。您指定的 ID (android.R.id.content) 以 'android' 开头的事实是一个很大的赠品,即它是 android 系统,而不是您的系统。

相反,您希望将其放在您指定的导航抽屉内的位置,即 R.id.content_frame。您可以在上面的 xml 中查看您是如何指定的,我将在此处为您复制:

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<ListView
    android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp"
    android:background="#111"/>

于 2013-07-20T15:33:08.523 回答
0

我无法理解,但这是问题所在:

正如@spierce7 指出的那样,我调用片段替换的方式不正确(但为什么?)我的代码是:

getFragmentManager().beginTransaction().replace(android.R.id.content, new MemberHomeFragment()).commit();

当我改为:

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, new MemberHomeFragment()).commit();

有用。

于 2013-07-20T06:06:30.313 回答