【问题标题】:ListActivity with ActionBar support v7ListActivity 与 ActionBar 支持 v7
【发布时间】:2014-01-16 09:17:20
【问题描述】:

我的主 Activity 扩展了 ListActivity,现在我必须实现一个支持旧版本的 ActionBar。

我已经阅读了执行此操作的方法,我决定尝试这种方式:

我下载了ListActivity的源代码,修改了一些东西,现在这里需要实现ActionBar,所以我想把这个Activity扩展成ActionbarActivity。这样,我将有一个自定义的 ActionBarListActivity,我可以将我的 Activity 扩展到这个自定义类,然后拥有 ListActivity 和 ActionBar 的功能。

这些是我已经完成的步骤:

  • 将 support v7 库添加到我的项目中
  • 将@Style/Theme.AppCompat 设置为应用程序主题

但是当我试图将 Activity 扩展到 ActionBarActivity 时,不允许我这样做,它说“ActionbarActivity 无法解析为一种类型”并建议将其更改为“ActionBar”(android.app)。我知道我必须导入“import android.support.v7.app.ActionBarActivity”,但它不允许我这样做。

那么,这里出了什么问题?

【问题讨论】:

  • 你有必要用 ListActivity 扩展你的类吗?如果没有,您可以使用 ActionBarActivity 扩展您的类并在您的活动中单独使用 ListView。让我知道这是否可行,否则将寻求其他解决方案。
  • @Rishi Kolvekar 这也不起作用,你说的方式是我第二次这样做的机会。但是在我的任何应用程序的活动中扩展 ActionBarActivity 时,我遇到了一些问题。
  • 好的,您是否通过右键单击项目并从“Android工具”中选择“添加支持库”来添加支持库?如果是,请确认您已从项目属性中检查了“Java Build Path >> Order and export”。
  • @Rishi Kolvekar 是的,我已经添加了支持库。在 Java Build Path >> Libraries 中,我将其包含在“Android 依赖项”中,但未包含在“Android Privte Libraries”中
  • 要在“Android Private Libraries”中添加库,您需要将此jar文件粘贴到项目根目录的“libs”文件夹中。如果“libs”文件夹不可用,您可以创建一个,然后在其中粘贴 android 支持 jar 文件,您会在“Android Private Libraries”中找到一个 jar 文件条目,我希望这会有所帮助。

标签: android list android-actionbar


【解决方案1】:

一种更简单的方法(下载源代码等)是将列表分解为一个片段,并将片段包含在 Activity 中。我将概述到达那里的步骤:-

  1. 将列表拆分为它自己的布局 XML。所以你最终会得到 2 个 XML - 一个用于 Activity '容器',这将非常简单 - (参见步骤 2),另一个用于新的 Fragment 布局,它将成为列表的整体布局,但最重要的是将包括<ListView> 元素)。
  2. 在活动的布局 XML 中包含一个 <FrameLayout> 占位符(作为片段的容器)。它将嵌套在顶层布局中(<RelativeLayout> 将作为顶层布局)。为占位符提供一个 ID,例如 myFragmentHolder
  3. 创建一个名为 MyListFragment 的新 Fragment 类(扩展 ListFragment)。
  4. 将所有列表代码(如 ArrayAdapter 代码等)移动到新的片段类中
  5. 您的 Activity 代码现在实际上只是一个用于包含片段和管理 ActionBar 的外壳。为了支持onCreate() 中的列表片段,它只需要调用setContentView() 并替换片段:-getSupportFragmentManager().beginTransaction().setTransition(FragmentTransaction.TRANSIT_ENTER_MASK).replace(R.id.myFragmentHolder, new MyListFragment(), "MY_LIST").commit();。 (“MY_LIST”是您用来识别片段的任意标签名称。它可以是任何东西 - 阅读文档了解更多信息)。
  6. 您的 Activity 仍应扩展 ActionBarActivity

现在您已经很好地分离了关注点。 Activity 管理 ActionBar,Fragment 管理 List。

【讨论】:

  • 我了解原理,这似乎是一个很好的解决方案。但是,您能详细说明一下吗? 1.原来的主要活动会有自己的xml,那么有什么要拆分的呢? 2.Framelayout作为原始xml中的根元素? 5 在getSupport...等语句中,什么是R.idmyFragmentHolder?,什么是MyListFragment? (在 3 下创建的那个?),是否应该将“MY_LIST”替换为其他字符串??我希望得到澄清。谢谢
【解决方案2】:

这听起来不像你特别正确地导入了库。

在eclipse中你需要右键点击项目,进入Properties,在列表中选择Android然后Add添加库

按照文档中的教程进行操作

http://developer.android.com/tools/support-library/setup.html

更新:

试试这个:

  • "sdk/extras/android/support/v7/appcompat"将支持库作为项目导入。

  • 项目中的参考库(对于 Eclipse,"Properties - Android - Add")。

  • 构建项目(对于 Eclipse,"Projects - Build All")。确保您的主项目 gen 文件夹中有 "android.support.v7.appcompat"

如果还是不能解决你的问题,重启eclipse。

然后清理并重建项目

如果问题仍然存在,请从您的计算机中删除支持库并重新下载并按照上述步骤操作。

【讨论】:

  • @masmic_87 我很确定您的 Library 类不可用,这就是为什么您收到“ActionbarActivity 无法解析为类型”错误。
  • 我的 gen 文件夹中有“android.support.v7.appcompat”,但“构建全部”和“构建项目”都没有可选选项。我在其他项目中使用相同的库并且它可以工作,所以不会是支持库的问题
【解决方案3】:

感谢 Nebu 的精彩解释。

Theo,为简单起见,您可以查看本教程,了解如何使用 ListView 对象将 ListActivity 更改为 ActionBarActivity。 (http://www.opensourcealternative.org/tutorials/android-tutorials/simple-android-listview-without-listactivity/)

但是,Theo,我会尝试用更多细节来澄清 Nebu 的指示,以便尝试回答您关于他的指示的问题。

Theo,据我所知,这是 Nebu 所说的需要做的事情。

在 listactivity 的原始 Activity 的 XML 中,您有一个 FrameLayout。

您要将 FrameLayout 元素复制到 ListFragment 的新 XML 中,FrameLayout 将成为新 XML 文件中的根元素。

在原始活动的 XML 文件中,将原始 FrameLayout 元素替换为 FrameLayout 元素和 ID 的简单声明,只是 XML 元素的开始和结束标记,没有任何子元素。这将用于在运行时使用 ListFragment 中的 FrameLayout 填充。

R.id.myFragmentHolder 是您原始活动的 XML 文件中 FragmentLayout 占位符的 ID。

“new MyListFragment()”调用正在调用新 ListFragment 类的构造函数。

“MyList”可以是任何字符串,我个人会让它更能描述我正在使用的列表,但这没关系。在 Google 中搜索 android 片段标签以了解有关标签的更多信息。

当您扩展 ActionBarActivity 时,除非您在替换原始 ListActivity 类的 actionbaractivity 类中导入 android.support.v7.app.actionbaractivity ,否则您会收到错误。

如果我遗漏了什么或者有什么不清楚的地方,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2013-07-28
    • 2014-04-29
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多