为了账号安全,请及时绑定邮箱和手机立即绑定

滑动抽屉出现在所有活动中

/ 猿问

滑动抽屉出现在所有活动中

海绵宝宝撒 2019-12-26 11:04:37

我正在开发一个包含许多活动的应用程序,并且我使用滑动抽屉创建了自己的菜单(我不想使用内置菜单按钮),因为滑动抽屉位于屏幕底部并且包含我的菜单按钮

我需要做的是让滑动抽屉出现在我的所有活动中

我试图创建一个活动并将其内容视图设置为包含抽屉的xml文件,然后将该活动扩展到所有其他活动中,但是此解决方案不起作用

有什么建议吗?


查看完整描述

3 回答

?
UYOU

扩展是正确的方法。只需以正确的方式覆盖setContentView。这是工作示例,但我使用一个创建的自定义标签栏来代替抽屉:


使用抽屉定义布局,如下所示:


这是 act_layout.xml


<LinearLayout

  ...

  android:orientation="vertical"

>

  <YourDrawer

    ...

  />

  <FrameLayout

    android:id="@+id/act_content"

    ...

  >

    // Here will be all activity content placed

  </FrameLayout>

</LinearLayout>

这是您的基本布局,将在act_content框架中包含所有其他布局。接下来,创建一个基本活动类,并执行以下操作:


public abstract class DrawerActivity extends Activity {


    protected LinearLayout fullLayout;

    protected FrameLayout actContent;


    @Override

    public void setContentView(final int layoutResID) {

        // Your base layout here

        fullLayout= (LinearLayout) getLayoutInflater().inflate(R.layout.act_layout, null); 

        actContent= (FrameLayout) fullLayout.findViewById(R.id.act_content);


        // Setting the content of layout your provided to the act_content frame

        getLayoutInflater().inflate(layoutResID, actContent, true); 

        super.setContentView(fullLayout);


        // here you can get your drawer buttons and define how they 

        // should behave and what must they do, so you won't be 

        // needing to repeat it in every activity class

    }

}

我们要做的基本上是拦截对setContentView(int resId)的所有调用,从xml扩展抽屉的布局,为活动扩展布局(通过方法调用中提供的reId),根据需要将它们组合起来,并设置为contentView活动。


编辑: 创建完以上内容后,只需照常编写应用程序,创建布局(不提及抽屉),创建活动,但不扩展简单活动,而是扩展DrawerActivity,如下所示:


public abstract class SomeActivity extends DrawerActivity {


    protected void onCreate(Bundle bundle) {

        setContentView(R.layout.some_layout);

    }

}

发生的是setContentView(R.layout.some_layout)被拦截。DrawerActivity加载从xml提供的布局,加载抽屉的标准布局,将其合并,然后将其设置为活动的contentView。


查看完整回答
反对 回复 2019-12-26
?
SMILET

终于在三年之后,这是这个重要问题的完整解决方案,对于谁可能还没有完全由奥尔洛夫先生的回答来指导。


他制作层次结构视图的方法完全可以,但是有一些小错误可能会误导初学者。


正如Gabe还提到的那样,您可以在声明中摆脱抽象。

不需要用FrameLayout包裹两个孩子。父级可以是RelativeLayout,LinearLayout等。但是最重要的部分是必须在Slider之前声明FrameLayout。

因此,100%的工作解决方案将是这样的:


activity_drawer.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent" >


<FrameLayout

    android:id="@+id/drawer_frame"

    android:layout_width="match_parent"

    android:layout_height="match_parent" />


<YourDrawer

    android:id="@+id/drawer_drawer"

    android:layout_width="match_parent"

    android:layout_height="fill_parent" >


</YourDrawer>


</RelativeLayout>

DrawerActivity.java


public class DrawerActivity extends Activity {


protected RelativeLayout fullLayout;

protected FrameLayout frameLayout;


@Override

public void setContentView(int layoutResID) {


    fullLayout = (RelativeLayout) getLayoutInflater().inflate(R.layout.activity_drawer, null);

    frameLayout = (FrameLayout) fullLayout.findViewById(R.id.drawer_frame);


    getLayoutInflater().inflate(layoutResID, frameLayout, true);


    super.setContentView(fullLayout);


    //Your drawer content...


}


}

MainActivity.java


public class MainActivity extends DrawerActivity {


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);


}


}

不要忘记在清单中声明DrawerActivity。


希望能有所帮助。


查看完整回答
反对 回复 2019-12-26
?
侃侃无极

我知道这已经晚了两年,但是对于那些想要在这里回答的人来说,它是。奥尔洛夫先生的回应是适当的,仅需进行一些调整。

  • 公开后删除摘要。(这是导致错误的原因)

  • 将滑动抽屉和FrameLayout换成另一个FrameLayout,并将宽度和高度设置为match_parent。(这允许同时出现两个布局)。

还:如果您希望滑动抽屉出现在布局的顶部(duh!),则将位于slideDrawer之后的frameLayout放在slideDrawer之前。


查看完整回答
反对 回复 2019-12-26

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信