同一个app,不同sdk风格不同

Same app, different style for different SDK

我是 android 的新手。作为 ActionBar 练习的一部分,我正在尝试为不同的 API 级别使用不同的主题。这是一个带有空白 activity.

的简单应用

有关该应用程序的详细信息: 最低 SDK 版本:17 / 4.2 JB

我的 AndroidManifest 条目:

<manifest package="bitsandpizzas.test.com.bitzpizzaz"
          xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity
            android:name=".OrderActivity"
            android:label="@string/title_activity_order"
            android:parentActivityName=".MainActivity">
        </activity>
    </application>

</manifest>

我的主要Activity代码:

package bitsandpizzas.test.com.bitzpizzaz;

import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ShareActionProvider;

public class MainActivity extends Activity {

    private ShareActionProvider _shareActionProvider;

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

    private void share (Menu menu) {
        MenuItem item = menu.findItem(R.id.action_share);
        this._shareActionProvider = (ShareActionProvider) item.getActionProvider();
        setIntent("Sample Text ....");
    }

    private void setIntent (String text) {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("text/plain");
        intent.putExtra(Intent.EXTRA_TEXT, text);
        this._shareActionProvider.setShareIntent(intent);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        //share(menu);
        return super.onCreateOptionsMenu(menu);
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_create_order:
                Intent orderIntent = new Intent(this, OrderActivity.class);
                startActivity(orderIntent);
                return true;

            case R.id.action_setting:
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

我为 v21 创建了一个默认 style.xml 和一个 style.xml 默认 style.xml 条目:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:background">#AE71AB</item>
</style>

style.xml 对于 v21 :

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Material.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

当我在 Nexus 4 模拟器上 运行 API-19 时,我得到以下屏幕:

当我在 Nexus 5 模拟器上 运行 时 API-21 我得到以下屏幕:

要解决 API-19 问题,我需要 MainActivity extend import android.support.v7.app.AppCompatActivity;

然后在 API-19 / Nexus 4 上我得到了预期的 UI :

但是在 API-21 上它崩溃了。

我还注意到 MainActivity 在 v21 上扩展 Activity 我添加的操作(分享和订购,加号)从来没有出现在操作栏上,尽管有足够的 space.

问题: 1. 错误是什么,如何有效处理不同 API 级别的不同风格? 2. 为什么定义的动作从不出现在 API-21 的 ActionBar 上?

在此先感谢您的指导。

首先,您可以在 post 之后对所有 api(s):

使用 AppCompat

http://android-developers.blogspot.co.uk/2014/10/appcompat-v21-material-design-for-pre.html

这意味着,您在 activity 上使用了不正确的主题,让我们看看这些代码:

import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ShareActionProvider;

public class MainActivity extends Activity {

将其更改为:

public class MainActivity extends AppCompatActivity

你可以做这些事情,比如使用 Android Studio Shortcuts 顺便说一句,删除未使用的代码,

让我们使用 AppCompat :)

我很确定,在 logcat androidstudio 中,您应该将主题更改为 AppCompat