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

18

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

我需要做的是使这个滑动抽屉在所有我的活动中都出现。

我尝试创建一个活动并将其内容视图设置为包含抽屉的XML文件,然后在所有其他活动中扩展该活动,但此解决方案无法正常工作。

那么有什么建议吗?

3个回答

42

扩展是正确的方法。只需以正确的方式覆盖setContentView即可。 这是一个工作示例,但我使用了自定义的tabbar而不是抽屉式菜单:

像这样定义带有您的抽屉式菜单的布局:

这是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中为抽屉(drawer)填充布局,通过方法调用中提供的resId为活动(activity)填充布局,将它们按需组合,并设置为活动的contentView。
编辑: 在创建以上内容后,像往常一样继续编写应用程序,创建布局(不需要提及抽屉),创建活动,但是不要继承SimpleActivity,而是继承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。

谢谢您的回答,但我没有理解它的要点,您能否请再详细解释一下?我按照您的指示创建了一个类来绘制滑动抽屉,并将其扩展到其他类中。结果是我在屏幕上正确地获得了抽屉,但我无法设置子活动的视图,您能告诉我如何做到这一点吗? - Zak
我尝试了你的建议,并像提供的示例一样将它们组合起来,然后从子类中调用setContentView,将我的新活动的xml根id传递给它。公共类AlJazeera扩展自MenuSlider { Context ctx = this; 受保护的FrameLayout布局; /** 当活动第一次创建时调用。*/ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.id.idl); }} - Zak
@AlexOrlov 不错的想法,在我的情况下,我需要将其与MapActivity和ListActivity一起使用,因此无法从一个共同的基类继承。 - aromero
1
完成后,我可以在操作栏中看到导航抽屉图标,但无法与其交互。有任何想法为什么? - Shridutt Kothari
@aromero 只需在您的 DrawerActivities 中使用 MapFragments 和 ListFragments。 - brainmurphy1
显示剩余10条评论

13

经过3年的努力,终于为那些可能没有完全按照奥洛夫先生的答案指导的人提供了这个重要问题的完整解决方案。

他制作层次视图的方法完全没问题,但有一些小错误可能会误导初学者开发人员。

  1. 正如加贝所提到的,您可以在声明中摆脱抽象。
  2. 没有必要用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...

}

}

主活动.java

public class MainActivity extends DrawerActivity {

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

}

}
不要忘记在清单文件中声明 DrawerActivity。
希望它有所帮助。

我的清单文件中没有抽屉活动,但它仍然可以正常工作。请注意,我现在使用的是23.0.1版本。 - Stephane

2

我知道这已经晚了两年,但是对于那些需要答案的人,这里有一个答案。Orlov先生给出了恰当的回答,只需要做一些调整。

  • 删除public之后的摘要。(这是导致错误的原因)
  • 将你的滑动抽屉和FrameLayout都包裹在另一个FrameLayout中,并将宽度和高度设置为match_parent。(这样两个布局都可以显示)

另外:如果你想让滑动抽屉显示在布局的上方(显然!),那么请将滑动抽屉后面的frameLayout放在滑动抽屉之前。


嗨,我尝试了你的建议,但是我遇到了一些问题,你能否请提供设计文件计划作为XML格式? - itsrajesh4uguys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接