带ActionBar的ListActivity支持v7

时间:2014-01-16 09:17:20

标签: android list android-actionbar

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

我已经知道如何做到这一点,我决定尝试这种方式:

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

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

  • 将支持v7库添加到我的项目
  • 将@ Style / Theme.AppCompat
  • 设置为aplications主题

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

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

3 个答案:

答案 0 :(得分:3)

更简单的方法(下载源等)是将列表分解为片段,并在片段中包含片段。我将概述到达目的地的步骤: -

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

答案 1 :(得分:1)

听起来好像你特别是导入了这个库。

在eclipse中你需要右键点击项目,转到属性,在列表中选择Android,然后添加添加库

在文档中按照本教程

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。

然后清理并重建项目

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

答案 2 :(得分:1)

谢谢Nebu的精彩解释。

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

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

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

在原始活动的listactivity的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,否则会出现错误。

如果我遗漏了任何内容或有任何不清楚的地方,请告诉我。