之前已经问过这个问题 - 但根本没有令人满意的答案!所以我再试一次.
我想给我的应用程序启动器图标(在开始屏幕上显示的图标!)一个不同的,更短的标题.似乎发射器从mainfest部分获取了关于主要活动标签的标签,如下所示:
<activity android:name="MainActivity" android:label="@string/app_short_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
我已将此应用程序名称@ string/app_name的原始引用更改为其他更短的字符串资源.
但是 - 大但是:这当然也改变了这个活动的默认标题!而且我不希望这种情况发生,有足够的空间来申请长名称!onCreate
使用该setTitle(int)
方法再次设置长标题也没有用,因为短名称将在短时间内对用户可见,但需要足够长的时间才能注意到!
并且 - 请不要通过引用自定义标题栏来回答我的问题...我不想走那么长的路,只是因为一个愚蠢的字符串标题!绘制一个自定义标题栏以获得如此小的效果是一件痛苦的事!
有没有简单的方法只是给启动器一个不同的字符串来显示?谢谢你的回答!
编辑:拥有自定义标题栏的另一个原因是它看起来不像默认的标题栏,我必须明确地做一些事情,使它在每个设备上看起来都很相似!如果毕竟我不想要一个不同的外观,这不可能是一个解决方案!
只是想知道如何处理以下问题:根据两个微调器的选定项目计算结果.为了处理UI事物,即用户在其中一个微调器中选择一个新项目,我setOnItemSelectedListener
在我onCreate()
的活动方法中为旋转器安装了一个监听器.
现在:当然,这很好.听众的工作是触发结果的新计算.
问题:因为我拦截onPause()
onResume()
了保存/恢复最后一个状态,我得到了一个方法,可以像这里一样以编程方式设置这两个微调器的选定项:
startSpinner.setSelection(pStart);
destSpinner.setSelection(pDest);
Run Code Online (Sandbox Code Playgroud)
这两个调用也会调用侦听器!我的结果的计算方法加上新结果集的通知在这里被调用两次!
一个愚蠢的直接方法就是让一个布尔变量禁用侦听器在里面做的任何事情,在设置所选项目之前设置它并在之后重置它.好的.但是有更好的方法吗?
我不希望通过代码操作来调用侦听器,只能通过用户操作来调用!:-(
你怎么做呢?谢谢!
我对Android中的ComponentName类有点困惑.
有不同的方法来获取组件名称对象,但我不知道何时使用哪个...以及为什么!
例:
de.zordid.sampleapp
de.zordid.sampleapp.widget.WidgetProvider
运用
ComponentName cn = new ComponentName("de.zordid.sampleapp.widget",
"WidgetProvider");
Run Code Online (Sandbox Code Playgroud)
我得到了这个组件信息:ComponentInfo{de.zordid.sampleapp.widget/WidgetProvider}
,但我无法使用它 - 组件未知!但是JavaDoc说我应该给那个包中的包和类 - 这就是我做的,不是吗?
运用
ComponentName cn = new ComponentName(context, WidgetProvider.class);
Run Code Online (Sandbox Code Playgroud)
产量ComponentInfo{de.zordid.sampleapp/de.zordid.sampleapp.widget.WidgetProvider}
- 而且工作正常!!
甚至还有另一种获取ComponentName的方法 - 通过上下文和字符串.应该在何时何地使用哪一个?
谢谢!
也许这很容易,但到目前为止,我BroadcastReceiver
还是无法解决这个问题......我等待被AlarmMangager触发 - 这很好用.
现在:因为事件,如果它发生,需要刷新主Activity的屏幕上的一些元素,我想从该背景BroadcastReceiver向我的Activity发送一个Intent - 但前提是它当前在前台,也就是活动.
如果它没有运行或不可见,我不在乎 - 我想做的最后一件事是按照我的意图启动Activity!我在onResume()方法中处理重新绘制视图,所以我根本不关心.
有关如何做到这一点的任何提示?谢谢!
编辑:我的BroadcastReceiver正在等待必须通知用户的警报.所以,它必须在那里并在清单中声明.问题是:它必须决定所提到的活动当前是否在前面.
我无法改变这种感觉:再次,Android开发人员提出了一些新的东西,让所有人都不知道他们会如何看待这个功能.
我在谈论Android O中的通知频道.
多年来,我一直在使用兼容性支持库来避免处理特定的平台细节.即:NotificationCompat
.
现在,Builder
要求我提供一个通知通道ID,这很好,但完全不用我创建这样一个通道.我找不到任何compat支持创建频道.我也找不到合适的方法来在正确的点上创建它们.
文档只是声明它应该"在某处"和"在发出通知时可能不会".但究竟我应该做什么?我讨厌为简单的任务编写特定版本的东西 - 这就是我使用compat库的原因.
有没有人建议如何处理它?当我想要显示通知时,每次创建是否"昂贵"?
java android-notifications android-support-library android-8.0-oreo
我自己的应用程序使用与2016年Google I/O应用程序所示的完全相同的技术.请参阅源代码
我需要在非常具体的时间点提醒用户 - 使用通知.
为此,我使用它AlarmManager
在正确的时间点唤醒设备:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
am.setExact(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent);
} else {
am.set(AlarmManager.RTC_WAKEUP, alarmTime, pendingIntent);
}
Run Code Online (Sandbox Code Playgroud)
这pendingIntent
是这样创建的:
final Intent intent = new Intent(MyAlarmService.ACTION_NOTIFY_RIDE, null, this, MyAlarmService.class);
pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
Run Code Online (Sandbox Code Playgroud)
现在,我的MyAlarmService
类是一个简单的IntentService
处理唤醒只是为了为用户创建通知.
我在日志中收到的消息如下:
W/ActivityManager: Background start not allowed: service Intent { act=xxx.xxx.xxx.action.NOTIFY_RIDE flg=0x4 cmp=xxx.xxx.xxx./xxx.xxx.xxx.service.MyAlarmService (has extras) }
Run Code Online (Sandbox Code Playgroud)
现在,谷歌自己的实施显然已被打破 - 即使我不想做任何繁重的背景工作,我也不能再使用这种技术了.但是,我应该如何在非常具体的时间点唤醒用户呢?(想想我的应用程序作为闹钟)
我的应用程序很简单,不需要很多本地化.
我提供默认语言(英语)和德语 - 这是我想要和将来提供的所有内容,因为该应用程序完全专注于德国.
正如我最近添加的Google Play服务库,我面临的问题是我的应用程序中添加了56(!!!)其他语言,正如Google Play商店告诉我的那样.原因是:图书馆附带了更多我不希望在我的应用程序中使用的语言资源.如果Google Play对话框以法语弹出,其余部分只有英语/德语,那就没有任何意义.
我不想手动删除库项目中的资源,这很繁琐且容易出错.另外,也许我会有另一个应用程序依赖于同一个库,我想要更多语言?
那么 - 我怎么能做到这一点?
谢谢!
据我所知,关于Widgets的官方文档我有点困惑.
"标准"方式是定义BroadcastReceiver
和定义更新频率(以毫秒为单位) - 这种方式允许30分钟的最小更新间隔以节省电池电量.听起来很合理.
我发现阅读Google文档的"手动"方式是使用自己来处理小部件的更新AlarmManager
.使用这种方法可以实现更高的更新间隔(当然不鼓励!)并且可以使用在睡眠时不唤醒设备的警报类型.(我假设一旦设备因某些其他原因被唤醒,事件发生之后的任何时间都会发送意图 - 是吗?)
现在,我对以下想法感到困惑:小部件驻留在主屏幕上.或者至少这是他们将被发现的最常见的地方.Android在主屏幕上提供了许多页面(标准是5或7),因此即使用户放置了Widget,也可能看不到!
只要窗口小部件显示的信息只是一个非常简单的文本(如当前时间!),可以在任何需要时无需任何延迟地计算或导出,我不希望任何更新频率甚至设备唤醒意图不可见!
但只要设备处于打开状态或更具体:只要屏幕打开并且窗口小部件可见,我就需要大量的更新事件!就像显示秒数的时钟需要每秒重绘的意图!
怎么能实现呢?如何实现"Android模拟时钟"?方法A("标准")和B("手动")都没有给出我的高更新频率,但只要设备开启且我的小部件可见.
谁能给我一个暗示?
我真的遇到了麻烦:我想用FileChannel
s和MappedByteBuffer
s 读取几GB的HUGE文件- 我发现的所有文档都暗示使用该FileChannel.map()
方法映射文件相当简单.当然,限制为2GB,因为所有Buffer方法都使用int来定位,限制和容量 - 但系统隐含的限制如何呢?
实际上,我遇到很多关于OutOfMemoryException
s 的问题!并没有真正定义限制的文档!那么 - 如何将一个符合int-limit的文件安全地映射到一个或几个MappedByteBuffer
s而不仅仅是异常?
在尝试之前,我可以问系统我可以安全地映射文件的哪个部分FileChannel.map()
?怎么样?为什么关于这个功能的文档很少?
我正在努力使用SwipeRefreshLayout
Google支持库中的文档.
当我使用回调设置接收刷新调用时setOnRefreshListener
,我会执行操作,之后,我发现我需要再次将刷新状态设置为false - 如果我不这样做,我再也不能通过滑动来触发它!
mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
if (mSwipeRefreshLayout != null) {
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
Toast.makeText(getApplication(), "Refreshing!", Toast.LENGTH_SHORT).show();
//requestDataRefresh();
mSwipeRefreshLayout.setRefreshing(false);
}
});
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但请查看以下文档setRefreshing
:
/**
* Notify the widget that refresh state has changed. Do not call this when
* refresh is triggered by a swipe gesture.
*
* @param refreshing Whether or not the view should show refresh progress.
*/
public void setRefreshing(boolean refreshing) {...
Run Code Online (Sandbox Code Playgroud)
但是再次将刷新状态设置为false正是刷新后我必须要做的!
文档是错误的还是我看错了?该文件不应该说:"当刷卡手势触发刷新时,不要将刷新状态调用为真" …
android ×7
java ×2
alarmmanager ×1
apk ×1
bytebuffer ×1
components ×1
constructor ×1
file-io ×1
filechannel ×1
label ×1
launcher ×1
listener ×1
localization ×1
nio ×1
resources ×1
spinner ×1
strip ×1
titlebar ×1
wakeup ×1