我是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上运行时,我得到以下屏幕:
当我在Nexus 5模拟器API-21上运行相同的操作时,我会看到以下屏幕:
要解决API-19问题,我需要让MainActivity扩展导入android.support.v7.app.AppCompatActivity;
然后在API-19 / Nexus 4上,我按预期获得了用户界面:
但是在API-21上它崩溃了。
此外,我注意到MainActivity在v21上扩展了Activity,我添加的操作(共享和订单,加号)从未出现在操作栏上,尽管有足够的空间。
问题: 1.错误是什么,如何有效地处理不同API级别的不同风格? 2.为什么定义的操作永远不会出现在ActionBar for API-21上?
提前感谢所有指导。
答案 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