同一个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
我是 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