相同的应用程序,不同的SDK风格

时间:2015-12-29 15:54:49

标签: android android-actionbar android-styles

我是android的新手。作为ActionBar练习的一部分,我正在尝试为不同的API级别使用不同的主题。这是一个活动空白的简单应用。

有关该应用的详细信息: Min 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>

我的主要活动代码:

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>

v21的style.xml:

<!-- 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上运行时,我得到以下屏幕:

notice no action bar

当我在Nexus 5模拟器API-21上运行相同的操作时,我会看到以下屏幕:

enter image description here

要解决API-19问题,我需要让MainActivity扩展导入android.support.v7.app.AppCompatActivity;

然后在API-19 / Nexus 4上,我按预期获得了用户界面:

enter image description here

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

此外,我注意到MainActivity在v21上扩展了Activity,我添加的操作(共享和订单,加号)从未出现在操作栏上,尽管有足够的空间。

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

提前感谢所有指导。

1 个答案:

答案 0 :(得分:1)

首先,您可以在此帖子之后使用AppCompat表示所有api:

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

这意味着,您在活动中使用了错误的主题,让我们来看看这些代码:

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快捷键btw删除未使用的代码,

让我们使用AppCompat:)

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