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

时间:2011-02-07 14:51:13

标签: android menu slidingdrawer

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

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

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

所以有什么建议吗?

3 个答案:

答案 0 :(得分:40)

延伸是正确的方法。只需以正确的方式覆盖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。

答案 1 :(得分:13)

最后3年后,这里是对这个重要问题的完整解决方案,对于他来说,Orlov先生的答案可能没有完全引导他们。

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

  1. 正如Gabe所提到的,你可以在宣言中摆脱摘要。
  2. 没有必要用FrameLayout包装这两个孩子。父级可以是RelativeLayout,LinearLayout等。但最重要的部分是你必须在Slider之前声明FrameLayout。
  3. 所以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。

    希望它有所帮助。

答案 2 :(得分:2)

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

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

另外:如果您希望滑动抽屉出现在布局的顶部(呃!),请将slidingDrawer之后的frameLayout放在slidingDrawer之前。