不带actionbar的导航抽屉,android

不带actionbar的导航抽屉,android,android,navigation-drawer,Android,Navigation Drawer,我正在尝试在没有任何actionbar的情况下实现导航抽屉。 我在主布局的顶部有一个小布局,如下所示 我希望当我单击按钮时,导航抽屉将显示在小彩色布局下。 我试过一些例子,但抽屉总是这样 但我希望导航抽屉将出现在小布局下,而不是从顶部。 我想要这样的东西: 我怎样才能做到这一点 我的示例的xml文件: <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res

我正在尝试在没有任何actionbar的情况下实现导航抽屉。 我在主布局的顶部有一个小布局,如下所示

我希望当我单击按钮时,导航抽屉将显示在小彩色布局下。 我试过一些例子,但抽屉总是这样

但我希望导航抽屉将出现在小布局下,而不是从顶部。 我想要这样的东西:

我怎样才能做到这一点

我的示例的xml文件:

   <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" >

    <!-- The first child in the layout is for the main Activity UI -->

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffffff"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >

        <RelativeLayout
            android:id="@+id/actionBar"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_alignParentTop="true"
            android:background="#0f9d58" >
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/mainContent"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_below="@id/actionBar"
            android:background="#0f9d58" >

            <Button
                android:id="@+id/actionBarButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Click" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="100dp"
                android:gravity="center"
                android:text="Holy Operating Systems, Batdroid!"
                android:textSize="24sp" />

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_centerHorizontal="true" />
        </RelativeLayout>
    </RelativeLayout>

    <!-- Side navigation drawer UI -->

    <ListView
        android:id="@+id/navList"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_below="@id/actionBar"
        android:layout_gravity="left|start"
        android:background="#ffeeeeee" />

</android.support.v4.widget.DrawerLayout>
主要活动是:

  public class MainActivity extends Activity {

    private ListView mDrawerList;
    private ArrayAdapter<String> mAdapter;
    Button actionBarButton;
    Boolean buttonStateOpen;

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

        buttonStateOpen=false;

        final DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);

        mDrawerList = (ListView)findViewById(R.id.navList);

        addDrawerItems();


        actionBarButton=(Button) findViewById(R.id.actionBarButton);       
        actionBarButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                if(buttonStateOpen==false)
                 {
                    drawer.openDrawer(Gravity.LEFT);
                    buttonStateOpen=true;
                 }
                else if(buttonStateOpen==true)
                {
                    drawer.closeDrawer(Gravity.LEFT);
                    buttonStateOpen=false;
                }
            }
        });


        mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                 Toast.makeText(MainActivity.this, "Time for an upgrade!", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void addDrawerItems() {
        String[] osArray = { "Android", "iOS", "Windows", "OS X", "Linux" };
        mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, osArray);
        mDrawerList.setAdapter(mAdapter);
    }



}
方法1

如果您有固定的布局高度,您可以设置从顶部到列表视图的大部分边距

方法2

使用此方法计算相对高度

然后

然后使用此选项将运行时边距从顶部设置为ListView


是的,您可以在没有操作栏的情况下创建抽屉布局,这是非常可能的,只需执行以下步骤:

public class NavigationDrawerFragment extends Fragment implements View.OnClickListener {

    View drawerView;
    DrawerLayout mDrawerLayout;
    ActionBarDrawerToggle mDrawerToggle;
    RelativeLayout mRlUBAccLayout, mRlPaymentLayout, mRlAutoPayLayout;
    TextView mTvUBAccount, mTvMakePayment, mTvAutoPay;
    DialogClass mDialog;

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        drawerView = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        mRlUBAccLayout = (RelativeLayout) drawerView.findViewById(R.id.rl_accountlayout);
        mRlPaymentLayout = (RelativeLayout) drawerView.findViewById(R.id.rl_mkpaymentlayout);
        mRlAutoPayLayout = (RelativeLayout) drawerView.findViewById(R.id.rl_autppaylayout);


        mTvUBAccount = (TextView) drawerView.findViewById(R.id.tv_ubaccount);
        mTvMakePayment = (TextView) drawerView.findViewById(R.id.tv_mkpayment);
        mTvAutoPay = (TextView) drawerView.findViewById(R.id.tv_autopay);

        mRlPaymentLayout.setOnClickListener(this);
        mRlUBAccLayout.setOnClickListener(this);
        mRlAutoPayLayout.setOnClickListener(this);
        return drawerView;
    }

    public void showDrawer(DrawerLayout drawerLayout) {
        mDrawerLayout = drawerLayout;
        mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, R.string.drawer_open, R.string.drawer_close) {
            @Override
            public void onDrawerOpened(View drawerView) {
                getActivity().invalidateOptionsMenu();
                super.onDrawerOpened(drawerView);
            }

            @Override
            public void onDrawerClosed(View drawerView) {
                getActivity().invalidateOptionsMenu();
                super.onDrawerClosed(drawerView);
            }

            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                super.onDrawerSlide(drawerView, slideOffset);
                if(HomeFragmentActivity.defaultInstantance().viewingFragment == HomeFragmentActivity.Fragments.ACCOUNT_FRAGMENT){
                    setNavDrawerColor(0);
                }else if(HomeFragmentActivity.defaultInstantance().viewingFragment == HomeFragmentActivity.Fragments.PAYMENT_FRAGMENT){
                    setNavDrawerColor(1);
                }else if(HomeFragmentActivity.defaultInstantance().viewingFragment == HomeFragmentActivity.Fragments.AUTOPAY_FRAGMENT){
                    setNavDrawerColor(2);
                }
            }

        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerLayout.post(new Runnable() {
            @Override
            public void run() {
                mDrawerToggle.syncState();
            }
        });
    }
}
从活动中调用此方法ShowDrawerLayout。并在xml中为显示抽屉布局的视图添加以下代码:

<fragment
        android:id="@+id/fr_navdrawer"
        android:name="apjenius.vinton.NavigationDrawerFragment"
        android:layout_width="300dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:layout="@layout/fragment_navigation_drawer"
        tools:layout="@layout/fragment_navigation_drawer" />

尝试从布局应用程序\栏\设置操作栏的高度和宽度=0dp。。 因此,它不会影响代码,但会删除操作栏 像这样


我试过使用边距,但它只提供顶部边距,还提供了阴影,这意味着它在打开可绘制布局时不会显示小布局@Nilesh看到这个链接,我想当我第一次点击我的按钮时,抽屉将被打开,第二次点击按钮时,抽屉将被关闭。但问题是,在打开抽屉后,它以透明布局覆盖了整个布局,所以我不能再点击按钮。我怎样才能解决这个问题。我只想抽屉的布局在按钮下面@Nilesh你能提供完整的来源吗@Saraschandraa@DarkenShooter您希望导航抽屉显示在按钮下方还是按钮上?按钮下方。我已经添加了一个我想要的示例图像@萨拉桑德拉
public class NavigationDrawerFragment extends Fragment implements View.OnClickListener {

    View drawerView;
    DrawerLayout mDrawerLayout;
    ActionBarDrawerToggle mDrawerToggle;
    RelativeLayout mRlUBAccLayout, mRlPaymentLayout, mRlAutoPayLayout;
    TextView mTvUBAccount, mTvMakePayment, mTvAutoPay;
    DialogClass mDialog;

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        drawerView = inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
        mRlUBAccLayout = (RelativeLayout) drawerView.findViewById(R.id.rl_accountlayout);
        mRlPaymentLayout = (RelativeLayout) drawerView.findViewById(R.id.rl_mkpaymentlayout);
        mRlAutoPayLayout = (RelativeLayout) drawerView.findViewById(R.id.rl_autppaylayout);


        mTvUBAccount = (TextView) drawerView.findViewById(R.id.tv_ubaccount);
        mTvMakePayment = (TextView) drawerView.findViewById(R.id.tv_mkpayment);
        mTvAutoPay = (TextView) drawerView.findViewById(R.id.tv_autopay);

        mRlPaymentLayout.setOnClickListener(this);
        mRlUBAccLayout.setOnClickListener(this);
        mRlAutoPayLayout.setOnClickListener(this);
        return drawerView;
    }

    public void showDrawer(DrawerLayout drawerLayout) {
        mDrawerLayout = drawerLayout;
        mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, R.string.drawer_open, R.string.drawer_close) {
            @Override
            public void onDrawerOpened(View drawerView) {
                getActivity().invalidateOptionsMenu();
                super.onDrawerOpened(drawerView);
            }

            @Override
            public void onDrawerClosed(View drawerView) {
                getActivity().invalidateOptionsMenu();
                super.onDrawerClosed(drawerView);
            }

            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                super.onDrawerSlide(drawerView, slideOffset);
                if(HomeFragmentActivity.defaultInstantance().viewingFragment == HomeFragmentActivity.Fragments.ACCOUNT_FRAGMENT){
                    setNavDrawerColor(0);
                }else if(HomeFragmentActivity.defaultInstantance().viewingFragment == HomeFragmentActivity.Fragments.PAYMENT_FRAGMENT){
                    setNavDrawerColor(1);
                }else if(HomeFragmentActivity.defaultInstantance().viewingFragment == HomeFragmentActivity.Fragments.AUTOPAY_FRAGMENT){
                    setNavDrawerColor(2);
                }
            }

        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerLayout.post(new Runnable() {
            @Override
            public void run() {
                mDrawerToggle.syncState();
            }
        });
    }
}
<fragment
        android:id="@+id/fr_navdrawer"
        android:name="apjenius.vinton.NavigationDrawerFragment"
        android:layout_width="300dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:layout="@layout/fragment_navigation_drawer"
        tools:layout="@layout/fragment_navigation_drawer" />
mNavigationDrawerFragment =  (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.fr_navdrawer);
        mNavigationDrawerFragment.showDrawer((DrawerLayout) findViewById(R.id.dw_drawerLayout));