返回信息流# 首先谢谢各位的解答!
Solution:
错误信息:You need to use a *Theme.AppCompat theme*
修改Builder:`AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context,R.style.AlertDialogTheme);`
style.xml:`<style name="AlertDialogTheme" parent="Theme.AppCompat.Dialog.Alert"></style>`
- 传入的context并非来自Activity,故不包含AppCompat的style,手动指定style可解决。两个库的不同:android.app.AlertDialog是根据不同版本系统而决定对话框样式的,android.support.v7.app.AlertDialog可以给低版本的安卓带来AppCompat的样式,所以Builder()时需要指定AppCompat的具体样式Light、Dark还是regular的。
---
参考的书籍是《第一行代码》,此书基于 4.x 版本,而我的环境是 AS 2.1.2 , API 23 ,测试手机是 MotoX 2013 , API 22 。在通过广播接收器实现强制用户下线这个功能的时候,出现了一个关于 AlertDialog 的问题。
import android.app.AlertDialog 时: 功能正常,收到广播后弹出 AlertDialog 。
import android.support.v7.app.AlertDialog 时(默认引用的库):
在 API 22 的手机中运行,能够收到 Log.d(TAG,"Broadcast received")的日志,但无法生成 AlertDialog 并且程序已停止运行,显示错误为“ Unable to start receiver ...略...You need to use a Theme.AppCompat theme (or descendant) with this activity ”。项目中的 Activity 均继承与 AppCompatActivity ,且 style parent=“ Theme.AppCompat.Light.DarkActionBar ”。
~~在 API 23 的虚拟器上运行时,无法收到"Broadcast received"日志,但程序不会停止运行。~~(补充,结果如上)
```
//build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.roadna.broadcastbestpractice"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
}
```
```
//ForceOfflineReceiver.java
package com.roadna.broadcastbestpractice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
//import android.app.AlertDialog;
import android.util.Log;
import android.view.WindowManager;
public class ForceOfflineReceiver extends BroadcastReceiver {
public static final String TAG = "ForceOfflineReceiver";
@Override
public void onReceive(final Context context, Intent intent){
Log.d(TAG, "Broadcast received");
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle("Warning");
dialogBuilder.setMessage("You are forced to be offline. Please try to login again.");
dialogBuilder.setCancelable(false);
dialogBuilder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which){
ActivityCollector.finishAll();
Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
AlertDialog alertDialog = dialogBuilder.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
}
```
附上 StackOverflow 上一个相关的[帖子](http://stackoverflow.com/questions/30180052/you-need-to-use-a-theme-appcompat-theme-or-descendant-with-this-activity-chan)。更换 android.app.AlertDialog 库的解决方法就是参照其中一个答案,但并未触到问题的本质。
不胜感激~
同样也发在V2EX了
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #31260同步于 2016/7/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
[问题] Android关于 AlertDialog app 库和 support.v7.app 库
vscai
2016/7/12镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
BroadcastReciver - 它本身不是context,也没有context在它里面,但是每当一个新的广播到达的时候,框架都传递一个context对象到onReceive()。这个context是一个ReceiverRestrictedContext实例,它有两个主要函数被禁掉:registerReceiver()和bindService()。这两个函数在BroadcastReceiver.onReceive()不允许调用。每次Receiver处理一个广播,传递进来的context都是一个新的实例。
是不是这个context引起的问题
context没有AppCompat的style?我再研究研究context
【 在 sollian (sollian) 的大作中提到: 】
: BroadcastReciver - 它本身不是context,也没有context在它里面,但是每当一个新的广播到达的时候,框架都传递一个context对象到...
: 是不是这个context引起的问题
我比较好奇的是这个“在 API 23 的虚拟器上运行时,无法收到"Broadcast received"日志”
lz你是怎么注册这个广播的?再怎么说也不至于收不到啊
AndroidManifest.xml里注册。我也觉得挺奇怪的,AS自带的虚拟机,卡的不行(渣电脑),不想再启动了...
【 在 ytinrete 的大作中提到: 】
: 我比较好奇的是这个“在 API 23 的虚拟器上运行时,无法收到"Broadcast received"日志”
: lz你是怎么注册这个广播的?再怎么说也不至于收不到啊
【 在 vscai 的大作中提到: 】
: AndroidManifest.xml里注册。我也觉得挺奇怪的,AS自带的虚拟机,卡的不行(渣电脑),不想再启动了...
lz你要找到问题的原因啊,不能放弃啊,渣电脑就浇灭了你学习的热情?
这可不太好啊
另外清单文件里注册的更不可能收不到了。
哟,我又试了下,发现能收到日志同时闪退了[ema1]
【 在 ytinrete (ytinrete) 的大作中提到: 】
: lz你要找到问题的原因啊,不能放弃啊,渣电脑就浇灭了你学习的热情?
: 这可不太好啊
: 另外清单文件里注册的更不可能收不到了。
【 在 vscai 的大作中提到: 】
: 哟,我又试了下,发现能收到日志同时闪退了
好棒好棒,这就对了嘛!
恭喜呀,你现在就能专心解决主题的问题了,加油哇
一般我司的dialog都是用自定义布局自己实现的,所以不会存在主题的问题
已更新,非常感谢
【 在 ytinrete 的大作中提到: 】
:
: 好棒好棒,这就对了嘛!
: 恭喜呀,你现在就能专心解决主题的问题了,加油哇
: ...................