18

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

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

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

所以有什么建议吗?

4

3 回答 3

42

扩展是正确的方法。只需以正确的方式覆盖 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),根据需要将它们组合起来,并设置为活动。

编辑: 在你创建了上面的东西之后,像往常一样继续编写一个应用程序,创建布局(没有提到抽屉)创建活动,但不是扩展简单的活动,而是扩展 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。

于 2011-02-07T15:01:12.900 回答
13

终于在 3 年后,这里是这个重要问题的完整解决方案,可能没有完全由 Orlov 先生的回答指导。

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

  1. 正如 Gabe 还提到的,您可以在声明中摆脱抽象。
  2. 没有必要用 FrameLayout 包装两个孩子。父级可以是任何 RelativeLayout、LinearLayout 等。但最重要的部分是您必须在 Slider 之前声明 FrameLayout。

所以 100% 的工作解决方案是这样的:

活动抽屉.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。

希望它有所帮助。

于 2014-09-16T10:05:51.637 回答
2

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

  • 公开后删除摘要。(这是导致错误的原因)
  • 用另一个 FrameLayout 包装你的滑动抽屉和 FrameLayout,并将宽度和高度设置为 match_parent。(这允许出现两种布局)。

另外:如果你想让你的滑动抽屉出现在你的布局之上(呃!),那么将在slidingDrawer 之后的frameLayout 放在slidingDrawer 之前。

于 2013-06-04T01:45:46.137 回答