2014-01-16 74 views
2

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

我已经readed要做到这一点的办法,我决定尝试这种方式:

我下载ListActivity的源代码,我修改了几件事情,现在我需要在这里实现动作条,所以我试图将此Activity扩展为ActionbarActivity。这样,我会有一个自定义的ActionBarListActivity,并且我可以将我的Activity扩展到这个自定义类,然后具有ListActivity和ActionBar的功能。

这些都是我做的步骤:

  • 支持V7库添加到我的项目
  • 设为aplications主题@样式/ Theme.AppCompat

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

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

+0

它是否有必要使用ListActivity扩展您的类?如果没有,您可以使用ActionBarActivity扩展您的类并分别在您的活动中使用ListView。让我知道如果这个工程,否则将采取其他解决方案。 –

+0

@Rishi Kolvekar既不工作,你说的方式是我的第二次机会做到这一点。但是当我在任何应用程序的活动中扩展ActionBarActivity时,我遇到了一些问题。 – masmic

+0

好的,您是否通过右键单击项目并从“Android工具”中选择了“添加支持库”添加了支持库?如果是,请确认您已经从项目属性中签入了“Java Build Path >>订单并导出”。 –

回答

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。

那么干净和改造项目

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

+0

是的,这就是我所做的。 – masmic

+0

@ masmic_87我非常肯定你的库类不可用,这就是为什么你得到这个“ActionbarActivity不能解析为类型”错误。 –

+0

我在我的gen文件夹中有“android.support.v7.appcompat”,但我没有选择“Build all”选项,也没有“Build project”选项。我在其他项目中使用相同的库,它的工作原理,所以不能成为支持库的问题 – masmic

3

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

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

现在你有关注一个很好的分离。该活动管理ActionBar并且该片段管理该列表。

+0

我明白原则,它似乎是一个整洁的解决方案。但是,你能否详细说明一下?在1.原来的主要活动将有自己的XML,所以有什么分裂? 2. Framelayout作为原始xml中的根元素? 5在getSupport ...等语句中,什么是R.idmyFragmentHolder?,什么是MyListFragment? (在3之下创建的那个),“MY_LIST”是否应该被其他字符串替换?我希望澄清。谢谢 – Theo

1

谢谢尼布你的很好的解释。

西奥,为了简单起见,你可以看看如何通过使用一个ListView对象ListActivity更改为ActionBarActivity本教程。 (http://www.opensourcealternative.org/tutorials/android-tutorials/simple-android-listview-without-listactivity/

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

西奥,据我了解,这是NEBU是说需要做的事情。

在你原来的活动的XML为listactivity,你有一个FrameLayout里。

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

在原始活动的XML文件中,将原始FrameLayout元素替换为FrameLayout元素和ID的简单声明,而不包含任何子元素的XML元素的开始和结束标记。这将用于在运行时用ListFragment中的一个填充FrameLayout。

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

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

“MyList”可以是任何字符串,我会亲自使它更多地描述我正在使用的列表,但没关系。搜索Google for android片段标签了解更多关于标签的信息。

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

如果我错过了任何东西或者有什么不清楚的地方,请告诉我。