BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #31260同步于 2016/7/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖

[问题] Android关于 AlertDialog app 库和 support.v7.app 库

vscai
2016/7/12镜像同步11 回复
# 首先谢谢各位的解答! 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了
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
sollian机器人#1 · 2016/7/13
BroadcastReciver - 它本身不是context,也没有context在它里面,但是每当一个新的广播到达的时候,框架都传递一个context对象到onReceive()。这个context是一个ReceiverRestrictedContext实例,它有两个主要函数被禁掉:registerReceiver()和bindService()。这两个函数在BroadcastReceiver.onReceive()不允许调用。每次Receiver处理一个广播,传递进来的context都是一个新的实例。 是不是这个context引起的问题
vscai机器人#2 · 2016/7/13
context没有AppCompat的style?我再研究研究context 【 在 sollian (sollian) 的大作中提到: 】 : BroadcastReciver - 它本身不是context,也没有context在它里面,但是每当一个新的广播到达的时候,框架都传递一个context对象到... : 是不是这个context引起的问题
jinsen47机器人#3 · 2016/7/14
broadcast的context没有wrapper,也就是没有theme
ytinrete机器人#4 · 2016/7/14
我比较好奇的是这个“在 API 23 的虚拟器上运行时,无法收到"Broadcast received"日志” lz你是怎么注册这个广播的?再怎么说也不至于收不到啊
vscai机器人#5 · 2016/7/14
AndroidManifest.xml里注册。我也觉得挺奇怪的,AS自带的虚拟机,卡的不行(渣电脑),不想再启动了... 【 在 ytinrete 的大作中提到: 】 : 我比较好奇的是这个“在 API 23 的虚拟器上运行时,无法收到"Broadcast received"日志” : lz你是怎么注册这个广播的?再怎么说也不至于收不到啊
ytinrete机器人#6 · 2016/7/14
【 在 vscai 的大作中提到: 】 : AndroidManifest.xml里注册。我也觉得挺奇怪的,AS自带的虚拟机,卡的不行(渣电脑),不想再启动了... lz你要找到问题的原因啊,不能放弃啊,渣电脑就浇灭了你学习的热情? 这可不太好啊 另外清单文件里注册的更不可能收不到了。
vscai机器人#7 · 2016/7/14
哟,我又试了下,发现能收到日志同时闪退了[ema1] 【 在 ytinrete (ytinrete) 的大作中提到: 】 : lz你要找到问题的原因啊,不能放弃啊,渣电脑就浇灭了你学习的热情? : 这可不太好啊 : 另外清单文件里注册的更不可能收不到了。
ytinrete机器人#8 · 2016/7/14
【 在 vscai 的大作中提到: 】 : 哟,我又试了下,发现能收到日志同时闪退了 好棒好棒,这就对了嘛! 恭喜呀,你现在就能专心解决主题的问题了,加油哇 一般我司的dialog都是用自定义布局自己实现的,所以不会存在主题的问题
vscai机器人#9 · 2016/7/14
已更新,非常感谢 【 在 ytinrete 的大作中提到: 】 : : 好棒好棒,这就对了嘛! : 恭喜呀,你现在就能专心解决主题的问题了,加油哇 : ...................