我的片段隐藏了导航抽屉?

时间:2014-11-21 17:56:25

标签: android android-fragments

我的应用程序中有一个导航抽屉。如果我选择特定项目并滑动导航抽屉。片段与导航抽屉重叠。

我试图添加popBackStackImmediate();但是没有用。这就是它的样子

enter image description here

活动

public class Activity extends MainActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onNavigationDrawerItemSelected(int position)
    {
        // TODO Auto-generated method stub
        if (position == 1)
        {
            HomeFragment Frag = new HomeFragment();
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.container, Frag);
            transaction.commit();
        }
        else if (position == 2)
        {

        }
    }
    public void onDrawerOpened(View drawerview)
    {
        getFragmentManager().popBackStackImmediate();
    }

导航片段

public class NavigationDrawerFragment extends Fragment implements NavigationDrawerCallbacks
{
    private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";
    private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
    private static final String PREFERENCES_FILE = "my_app_settings"; 
    private NavigationDrawerCallbacks mCallbacks;
    private RecyclerView mDrawerList;
    private View mFragmentContainerView;
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mActionBarDrawerToggle;
    private boolean mUserLearnedDrawer;
    private boolean mFromSavedInstanceState;
    private int mCurrentSelectedPosition;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.fragment_navigation_drawer, 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<NavigationItem> navigationItems = getMenu();
        NavigationDrawerAdapter adapter = new NavigationDrawerAdapter(navigationItems);
        adapter.setNavigationDrawerCallbacks(this);
        mDrawerList.setAdapter(adapter);
        selectItem(mCurrentSelectedPosition);
        return view;
    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        mUserLearnedDrawer = Boolean.valueOf(readSharedSetting(getActivity(), PREF_USER_LEARNED_DRAWER, "false"));
        if (savedInstanceState != null)
        {
            mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
            mFromSavedInstanceState = true;
        }
    }

    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);
        try
        {
            mCallbacks = (NavigationDrawerCallbacks) activity;
        }
        catch (ClassCastException e)
        {
            throw new ClassCastException("Activity must implement NavigationDrawerCallbacks.");
        }
    }

    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;
                if (!mUserLearnedDrawer)
                {
                    mUserLearnedDrawer = true;
                    saveSharedSetting(getActivity(), PREF_USER_LEARNED_DRAWER, "true");
                }               
                getActivity().invalidateOptionsMenu();
            }
        };

        if (!mUserLearnedDrawer && !mFromSavedInstanceState)
            mDrawerLayout.openDrawer(mFragmentContainerView);

        mDrawerLayout.post(new Runnable()
        {
            @Override
            public void run()
            {
                mActionBarDrawerToggle.syncState();
            }
        });

        mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
    }

    public void openDrawer()
    {
        mDrawerLayout.openDrawer(mFragmentContainerView);
    }

    public void closeDrawer()
    {
        mDrawerLayout.closeDrawer(mFragmentContainerView);
    }

    @Override
    public void onDetach()
    {
        super.onDetach();
        mCallbacks = null;
    }

    public List<NavigationItem> getMenu()
    {
        List<NavigationItem> items = new ArrayList<NavigationItem>();
        items.add(new NavigationItem("Home", getResources().getDrawable(R.drawable.play)));
        items.add(new NavigationItem("News", getResources().getDrawable(R.drawable.play)));
        items.add(new NavigationItem("Videos", getResources().getDrawable(R.drawable.play)));
        items.add(new NavigationItem("Playlist", getResources().getDrawable(R.drawable.play)));
        return items;
    }

    void selectItem(int position)
    {
        mCurrentSelectedPosition = position;
        if (mDrawerLayout != null)
        {
            mDrawerLayout.closeDrawer(mFragmentContainerView);
        }
        if (mCallbacks != null)
        {
            mCallbacks.onNavigationDrawerItemSelected(position);
        }
        ((NavigationDrawerAdapter) 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)
    {
        mCallbacks.onNavigationDrawerItemSelected(position);
        selectItem(position);

    }

    public DrawerLayout getDrawerLayout()
    {
        return mDrawerLayout;
    }

    public void setDrawerLayout(DrawerLayout drawerLayout)
    {
        mDrawerLayout = drawerLayout;
    }
}

活动布局

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/toolbar_actionbar"
        layout="@layout/toolbar_default"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

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

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

        <!-- android:layout_marginTop="?android:attr/actionBarSize"-->
        <fragment
            android:id="@+id/fragment_drawer"
            android:name="com.RemoteIt.client.activity.drawer.NavigationDrawerFragment"
            android:layout_width="@dimen/navigation_drawer_width"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:layout="@layout/fragment_navigation_drawer"/>
    </android.support.v4.widget.DrawerLayout>
</RelativeLayout>

HomeFragment

public class HomeFragment extends Fragment
{

    public HomeFragment()
    {}

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

        int redActionButtonSize = getResources().getDimensionPixelSize(R.dimen.red_action_button_size);
        int redActionButtonMargin = getResources().getDimensionPixelOffset(R.dimen.action_button_margin);
        int redActionButtonContentSize = getResources().getDimensionPixelSize(R.dimen.red_action_button_content_size);
        int redActionButtonContentMargin = getResources().getDimensionPixelSize(R.dimen.red_action_button_content_margin);
        int redActionMenuRadius = getResources().getDimensionPixelSize(R.dimen.red_action_menu_radius);
        int blueSubActionButtonSize = getResources().getDimensionPixelSize(R.dimen.blue_sub_action_button_size);
        int blueSubActionButtonContentMargin = getResources().getDimensionPixelSize(R.dimen.blue_sub_action_button_content_margin);

        ImageView fabIconStar = new ImageView(getActivity());
        fabIconStar.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_important));

        FloatingActionButton.LayoutParams starParams = new FloatingActionButton.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
        starParams.setMargins(redActionButtonMargin, redActionButtonMargin, redActionButtonMargin, redActionButtonMargin);
        fabIconStar.setLayoutParams(starParams);

        FloatingActionButton.LayoutParams fabIconStarParams = new FloatingActionButton.LayoutParams(redActionButtonContentSize, redActionButtonContentSize);
        fabIconStarParams.setMargins(redActionButtonContentMargin, redActionButtonContentMargin, redActionButtonContentMargin, redActionButtonContentMargin);

        FloatingActionButton leftCenterButton = new FloatingActionButton.Builder(getActivity()).setContentView(fabIconStar, fabIconStarParams).setBackgroundDrawable(R.drawable.button_action_red_selector).setPosition(FloatingActionButton.POSITION_TOP_CENTER).setLayoutParams(starParams).build();

        // Set up customized SubActionButtons for the right center menu
        SubActionButton.Builder lCSubBuilder = new SubActionButton.Builder(getActivity());
        lCSubBuilder.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_action_blue_selector));

        FrameLayout.LayoutParams blueContentParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
        blueContentParams.setMargins(blueSubActionButtonContentMargin, blueSubActionButtonContentMargin, blueSubActionButtonContentMargin, blueSubActionButtonContentMargin);
        lCSubBuilder.setLayoutParams(blueContentParams);
        // Set custom layout params
        FrameLayout.LayoutParams blueParams = new FrameLayout.LayoutParams(blueSubActionButtonSize, blueSubActionButtonSize);
        lCSubBuilder.setLayoutParams(blueParams);

        ImageView lcIcon1 = new ImageView(getActivity());
        ImageView lcIcon2 = new ImageView(getActivity());
        ImageView lcIcon3 = new ImageView(getActivity());
        ImageView lcIcon4 = new ImageView(getActivity());
        ImageView lcIcon5 = new ImageView(getActivity());
        ImageView lcIcon6 = new ImageView(getActivity());
        ImageView lcIcon7 = new ImageView(getActivity());
        ImageView lcIcon8 = new ImageView(getActivity());
        ImageView lcIcon9 = new ImageView(getActivity());

        lcIcon1.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_camera));
        lcIcon2.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_picture));
        lcIcon3.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_video));
        lcIcon4.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_location_found));
        lcIcon5.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_headphones));
        lcIcon6.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_camera));
        lcIcon7.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_picture));
        lcIcon8.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_video));
        lcIcon9.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_location_found));

        // Build another menu with custom options
        FloatingActionMenu leftCenterMenu = new FloatingActionMenu.Builder(getActivity()).addSubActionView(lCSubBuilder.setContentView(lcIcon1, blueContentParams).build()).addSubActionView(lCSubBuilder.setContentView(lcIcon2, blueContentParams).build()).addSubActionView(lCSubBuilder.setContentView(lcIcon3, blueContentParams).build()).addSubActionView(lCSubBuilder.setContentView(lcIcon4, blueContentParams).build()).addSubActionView(lCSubBuilder.setContentView(lcIcon5, blueContentParams).build())
                .addSubActionView(lCSubBuilder.setContentView(lcIcon6, blueContentParams).build()).addSubActionView(lCSubBuilder.setContentView(lcIcon7, blueContentParams).build()).addSubActionView(lCSubBuilder.setContentView(lcIcon8, blueContentParams).build()).addSubActionView(lCSubBuilder.setContentView(lcIcon9, blueContentParams).build()).setRadius(redActionMenuRadius).setStartAngle(0).setEndAngle(360).attachTo(leftCenterButton).build();

        return v;
    }

}

2 个答案:

答案 0 :(得分:1)

FloatingActionButtonFloatingActionMenu类进行了以下更改,以允许将特定ViewGroup设置为两者的容器。测试是使用您发布的相似但更简单的代码版本进行的,因此您可能需要调整设置参数。

库代码假定按钮和菜单显示在活动内容视图的顶部,以及其中的所有内容。在FloatingActionButton类中添加容器ViewGroup成员允许我们将子ViewGroup指定为父类。请注意,只有在菜单中使用FloatingActionButton时,以下更改才有效。

FloatingActionButton类的补充:

public class FloatingActionButton extends FrameLayout {
    ...
    private ViewGroup containerView;
    ...
    public FloatingActionButton(Activity activity, 
                                LayoutParams layoutParams, 
                                int theme,
                                Drawable backgroundDrawable,
                                int position,
                                View contentView,
                                FrameLayout.LayoutParams contentParams      
                                // Note the addition of the following
                                // constructor parameter here
                                , ViewGroup containerView) {
        ...
        setClickable(true);

        // This line is new. The rest of the constructor is the same.
        this.containerView = containerView;     

        attach(layoutParams);
    }
    ...
    public View getActivityContentView() {
        if(containerView == null) {
            return ((Activity)getContext())
                .getWindow().getDecorView().findViewById(android.R.id.content);
        } else {
            return containerView;
        }
    }

    public ViewGroup getContainerView() {
        return containerView;
    }

    // The following setter is not strictly necessary, but may be of use
    // if you want to toggle the Button's and Menu's z-order placement
    public void setContainerView(ViewGroup containerView) {
        this.containerView = containerView;
    }
    ...
    public static class Builder {
        ...
        private ViewGroup containerView;
        ...
        public Builder setContainerView(ViewGroup containerView) {
            this.containerView = containerView;
            return this;
        }

        public FloatingActionButton build() {
            return new FloatingActionButton(activity,
                                            layoutParams,
                                            theme,
                                            backgroundDrawable,
                                            position,
                                            contentView,
                                            contentParams,
                                            // New argument
                                            containerView);
        }
    }
    ...
}

FloatingActionMenu类的更改:

public class FloatingActionMenu {
    ...
    public View getActivityContentView() {
        if(mainActionView instanceof FloatingActionButton && 
            ((FloatingActionButton) mainActionView).getContainerView() != null) {
            return ((FloatingActionButton) mainActionView).getContainerView();
        } else {
            return ((Activity)mainActionView.getContext())
                .getWindow().getDecorView().findViewById(android.R.id.content);
        }
    }
    ...
}

然后,在Fragment的onCreateView()方法中,我们需要添加setContainerView()类的新FloatingActionButton.Builder方法的调用。

public class HomeFragment extends Fragment {
    ...
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {
        ...
        FloatingActionButton leftCenterButton = new FloatingActionButton.Builder(getActivity())
            .setContentView(fabIconStar, null)
            .setBackgroundDrawable(R.drawable.ic_launcher)
            .setPosition(FloatingActionButton.POSITION_TOP_CENTER)
            .setLayoutParams(starParams)
            // The new method call is added here
            .setContainerView(container)
            .build();
        ...
    }
    ...
}

答案 1 :(得分:0)

请替换以下代码行

transaction.replace(R.id.container, Frag);

transaction.replace(R.id.content_frame, Frag);

由于 android.R.id.content ,我遇到了这个重叠的问题,我用 R.id.content_frame 替换了它解决了我的问题。

但我在你的代码中看到你使用了不同的容器视图ID,但这应该可以工作。