Android导航抽屉(调用活动)与抽象MainActivity

2023-11-27

我想要一个 AbstractMainActivity 来创建导航抽屉。在那里我还应该处理菜单项的点击,然后调用新的活动。在这些活动中,我想再次使用相同的导航抽屉。

我将使用 AbstractMainActivity 扩展子类,并以与每个子类不同的方式调用 getLayoutResourceID (如下所示:android如何创建自己的Activity并扩展它?).

问题是,现在在我想要构建导航抽屉的 AbstractMainActivity 中,我无法访问导航抽屉布局 (xml) 元素,因为我当然希望子类有不同的基本布局。

我需要在所有子类布局文件中“包含布局”吗?但这不起作用,如果我想在导航抽屉中使用活动而不是片段,我会做错什么?

public abstract class MainActivity extends Activity {

private String[] menuItems;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;

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

    setContentView(getLayoutResourceId());

    menuItems = getResources().getStringArray(R.array.menu_items);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);

    // Set the adapter for the list view
    mDrawerList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, menuItems));
    // Set the list's click listener
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

}


protected abstract int getLayoutResourceId();

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}


private class DrawerItemClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) {
        selectItem(position);
    }

    /** Swaps fragments in the main content view */
    private void selectItem(int position) {
        //Fragment fragment = new PlanetFragment();
        Bundle args = new Bundle();
       // args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);

        Intent intent = new Intent(MainActivity.this, ProductListActivity.class);
        startActivity(intent);

    }
}




public class ProductListActivity extends MainActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.options_menu, menu);
    return true;
}

@Override
protected int getLayoutResourceId() {
    // TODO Auto-generated method stub
    return R.layout.activity_product_list;
}

这是产品列表子类 (activity_product_list.xml) 的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
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=".ProductList" >

<include layout="@layout/activity_main"/>

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true" >
</ListView>

这是导航抽屉的布局(activity_main.xml):

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android1="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="300dp"
android:layout_height="500dp" >

<!-- The main content view -->
<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
<!-- The navigation drawer -->
<ListView android:id="@+id/left_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp"
    android:background="#c3c3c3"/>

但是不起作用,但是如果我没有它,当我的子类调用抽象类的onCreate时,我会得到空指针异常,我想在其中构建导航抽屉,它找不到要设置的布局元素列表和布局(R.id.left_drawer 或 R.id.drawer_layout)!


我也在试图弄清楚如何做到这一点。

我看过一个非常好的教程,它正是你想要的here。 这个想法是创建一个抽象活动类AbstractNavDrawerActivity所有带有抽屉的活动都将从继承。这个类使用了一个NavDrawerActivityConfigurationbean 类,包含有关导航抽屉的所有信息,包括需要膨胀的布局

另一种方法是创建一个NavDrawerUtil您可以在其中放置与导航抽屉交互的静态方法的类。然后,您可以根据需要从每个活动中调用这些方法。

第二种方法为您提供了更大的灵活性,您不必担心布局膨胀的顺序等,但我认为这是一个比第一种解决方案不太干净的解决方案AbstractNavDrawerActivity所有带有导航抽屉的活动都继承自您的建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android导航抽屉(调用活动)与抽象MainActivity 的相关文章

随机推荐

  • boost::算法::包含

    我查看了模板定义 参数似乎需要跨范围和谓词的迭代器 我传入了一个 vector begin end 和一个 std string 谓词 但仍然遇到许多与许多 boost 库项目相关的编译时错误 我可以看一下 boost algorithm
  • 仅用于 API 的 SSL 证书还是客户需要它们?

    我有一个 RESTFul API 我想使用 SSL 证书来保护它的安全 如果我要获得一些 SSL 证书 我是否需要为每个使用 API 的 Web 客户端单独提供一个证书 或者 API 是否是唯一需要证书的东西 SSL 证书安装在托管 RES
  • 渲染资产部分

    我在Rails 3 1上使用Ruby 我想知道如何在JavaScript资产中呈现部分 我的目标是 in app assets javascript cart js coffee erb a add sth click gt random
  • 如何在 Android Studio 中针对消息“调用需要 API 级别 21(当前最小值为 16)”启用 lint 错误?

    我有一个方法叫做setImageTintList 这要求最小 API 为 21 但是 如果我在 gradle 中将最小 API 设置为 16 应用程序仍然会在没有任何警告的情况下构建 虽然有一条红线说 setImageTintList 调用
  • 特定 GIT 应用程序作为 PIP 包安装要求

    我有这个应用程序https github com staticdev django crud utils需要安装 django sorting 才能工作 但它不可能是原始的 django sorting 而是我制作的一个叉子 https g
  • Postgresql:连接被拒绝。检查主机名和端口是否正确以及邮局主管是否接受 TCP/IP 连接 [重复]

    这个问题在这里已经有答案了 我正在尝试连接 postgresql 但收到此错误 org postgresql util PSQLException Connection refused Check that the hostname and
  • 在 MySQL 中的特定列之后添加多个列

    我需要向表中添加多列 但要定位列after一个名为lastname 我已经尝试过这个 ALTER TABLE users ADD COLUMN count smallint 6 NOT NULL log varchar 12 NOT NUL
  • 捕获从 Postgresql 到 PHP 的错误

    我想使用 php 捕获并显示网页上查询的错误 以我选择的方式 所以代替下面的代码 result pg query connection query if result success else echo pg last error conn
  • 如何对两个数组进行相互关联的排序?

    我在 python 中制作原型 并使用 zip 函数来实现此目的 我不知道如何在 Java 中执行此操作 基本上我有两个列表 一个是names其中之一是data 并希望它们相互关联地排序 我的程序只处理一个列表 data 在本例中 但我使用
  • 无法向 Angular TypeScript 类 (FormGroup) 添加新方法

    我正在尝试向 Angular 的 FormGroup 类添加一个附加方法 该方法将设置组的状态 从服务器设置错误状态 我有以下代码form helper ts我的 Angular4 应用程序中的文件 import FormGroup fro
  • 使用 git-svn 克隆多个 SVN 项目

    我有一个大型 Java 应用程序 它分为多个项目 每个项目在 Subversion 存储库中都有自己的文件夹 如下所示 会计核心 trunk branches tags Common trunk branches tags 网络通用 tru
  • Material UI 的工具提示 - 自定义样式[重复]

    这个问题在这里已经有答案了 如何更改 Material UI 工具提示的背景颜色和颜色 我尝试如下 但它不起作用 import createMuiTheme from material ui core styles export const
  • 返回值的复制构造函数何时发生

    我有以下成员函数 Person ClassB DoSomethingAndReturnPerson RAIIMutex myLock m mutex return m person RAIIMutex是一个辅助类 它接收互斥体并将其锁定在构
  • (CSS?)消除浏览器在超链接图像周围的“选定”线?

    所附屏幕截图来自 OS X Firefox 3 请注意 中心选项卡 图像 周围有一条虚线 显然是因为它是最近选择的选项卡 有没有办法可以消除 CSS 或 JavaScript 中的这条虚线 嗯 免费图像托管服务减小了图像的大小 但是如果您能
  • ListView 子项中的图像

    如何为列表视图子项添加图像而不是文本 喜欢http i44 tinypic com 2mzz6s6 png 通常我添加字符串的方式如下 ListViewItem item new ListViewItem A item SubItems A
  • 插入符训练方法抱怨有问题;所有 RMSE 指标值均缺失

    在很多情况下 我在尝试安装时都会遇到此错误gbm or rpart模型 最后 我能够使用公开数据一致地重现它 我注意到使用 CV 或重复的 cv 时会发生此错误 当我不使用任何适合控件时 我不会收到此错误 有人可以解释一下为什么我总是犯错误
  • 如何使用 symPy 和 numPy 用符号替换矩阵

    我试图用方程中的两个符号代替它们各自的矩阵形式 我创建了一个换向器函数 它形成了我的表达式 t vS sy symbols t vS commutative False hS t vS eta myComm t hS dHs myComm
  • 转换为 ScheduledThreadPoolExecutor

    我还是Java的初学者 所以我对线程和并发还没有了解太多 但是 我希望能够使用 ScheduledThreadPoolExecutor 作为计时器 因为我在使用 java util Timer 和 TimerTask 时遇到问题 我对线程的
  • Eclipse 拼写引擎不存在

    我在 Windows 上使用 Eclipse 3 4 Ganymede 和 CDT 5 当集成的拼写检查器不知道某些单词时 它会建议 除其他外 将该单词添加到用户词典中的选项 如果用户词典尚不存在 拼写检查器会提供帮助配置它并显示 常规 编
  • Android导航抽屉(调用活动)与抽象MainActivity

    我想要一个 AbstractMainActivity 来创建导航抽屉 在那里我还应该处理菜单项的点击 然后调用新的活动 在这些活动中 我想再次使用相同的导航抽屉 我将使用 AbstractMainActivity 扩展子类 并以与每个子类不