8

我刚开始做 Android 开发,或多或少遵循http://developer.android.com/training/basics/firstapp/starting-activity.html教程,有一件事一直困扰着我:我有两个类,均使用“Android Activity”创建向导创建:

public class PlacesActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_places);
        // I manually commented out the following line to get it to compile.
        // getActionBar().setDisplayHomeAsUpEnabled(true);
    }
    // ... other methods
}

public class ShowOnePlace extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_one_place);
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }
    // ... other methods
}

Eclipse 不断给我以下错误:

调用需要 API 级别 11(当前最低为 8):android.app.Activity#getActionBar

调用需要 API 级别 11(当前最低为 8):android.app.ActionBar#setDisplayHomeAsUpEnabled

直到我注释掉其中一行(如上所示)。现在,该应用程序似乎可以在我的 Android 设备上编译和运行而没有错误。(好吧,至少没有那个错误)。

所以:

  • 为什么getActionBar().setDisplayHomeAsUpEnabled(true);在一个类中给出该错误,但在另一类中完全相同的行不是错误——甚至不是警告?
  • “Android Activity”创建向导中是否存在错误,并且不知何故该getActionBar().setDisplayHomeAsUpEnabled(true);语句在一个活动中是错误的,但在另一个活动中却完全没问题?
  • Eclipse Lint 中是否存在错误,并且该语句在两个活动中实际上都可以(或者在两个活动中可能都是错误的)?
  • 我该怎么做才能在不将 minSdkVersion="8" 更改为 minSdkVersion="11" 的情况下解决此问题?我的印象是“android-support-v4.jar”文件是一个在版本 8 设备上运行的兼容性库,用于处理在版本 11 设备中本机处理的内容。
  • 当我看到此错误时,真正正确的做法是什么?
4

7 回答 7

16

使用getSupportActionBar()而不是getActionBar(). 这将在低于 11 的 API 级别上提供ActionBar功能。

于 2014-04-29T08:44:25.940 回答
14

简而言之,Action Bar 在旧版本的 Android 中不可用,并且 google 的支持库也不提供该功能。这就是 lint 抱怨的原因 - 您正在使用 API 版本 8 中不存在的代码,该版本设置为您的应用支持的最低 API 级别。如果你想在旧的 android 版本上使用操作栏,请使用名为“Action Bar Sherlock”的开源库。

现在来回答你的问题

  1. 这应该是两个类中的错误。在其中一个类中它不是错误的原因实际上并不重要。
  2. 这两个活动都是错误的
  3. 您必须使用在较旧的 android 版本上提供操作栏的开源库,即 ActionBar Sherlock 非常适合此目的
  4. 真正正确的做法是打开 Android Developers 网站并阅读支持库的限制。
于 2012-11-30T23:01:58.530 回答
4

如果您使用 appcompat-v7 及更高版本,则不能使用 actionbarsherlock,因为两者都定义了相同的属性。所以这个库有资源冲突。

使用您需要的支持库来做到这一点:(我希望您已经下载并在您的项目中集成了支持库)

  1. 您必须使用支持库中的 ActionBar,因此您必须使用正确的 ActionBarActivity 实现来扩展您的活动。

进口:

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;

活动:

public class PlacesActivity extends ActionBarActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_places);
        // I manually commented out the following line to get it to compile.
        // getActionBar().setDisplayHomeAsUpEnabled(true);
    }
    // ... other methods
}

因此您可以从旧版本支持的 Activity 中获取 actionBar 实现:

 ActionBar actionBar = activity.getSupportActionBar();

编写代码并玩得开心!

于 2014-06-14T14:55:19.757 回答
3

我通常用“@TargetApi(12)”注释来修复它

   @TargetApi(11)
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_show_one_place);
      getActionBar().setDisplayHomeAsUpEnabled(true);
   }
于 2014-12-02T21:32:01.560 回答
1
Why is "getActionBar().setDisplayHomeAsUpEnabled(true);" give that error in one class, but that exact same line is not an error -- not even a warning -- in the other class?

只需编辑第二个文件并保存。会报错!

Is there a bug in the "Android Activity" creation wizard, and somehow that "getActionBar().setDisplayHomeAsUpEnabled(true);" statement is wrong in one activity, but perfectly fine in the other?

或许

Is maybe there a bug in Eclipse Lint, and that statement is actually OK in both activities (or perhaps wrong in both activities)?

在给定的上下文中都是错误的

What do I have to do so that I can fix this without changing minSdkVersion="8" to minSdkVersion="11"? I was under the impression that the "android-support-v4.jar" file was a compatibility library that ran on version 8 devices to handle stuff that's handled natively in version 11 devices.

你需要改变minSDK我猜没有其他选择。如果你想使用FunctionsAPI 11

于 2012-11-30T22:28:04.310 回答
0

只需在 androidmanifest 中进行更改

作为

<uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="18" />
于 2014-09-27T16:27:56.897 回答
-2

issue is when you create an android app in eclipsyou have asked to select min and max api support and by default eclips select 8 as min and 19 as max if you encounter above error means the function you are using is of version which is greater then 8
to resolve this issue i just go in AndroidManifest.xml file and change following

<uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="19" />

minsdkversion by default is 8

于 2014-06-28T13:38:06.377 回答