我试图VectorDrawable在LayerList没有缩放矢量的情况下使用a .例如:
<layer-list>
<item android:drawable="@color/grid_item_activated"/>
<item android:gravity="center" android:drawable="@drawable/ic_check_white_48dp"/>
</layer-list>
Run Code Online (Sandbox Code Playgroud)
drawable ic_check_white_48dpid定义为:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>
Run Code Online (Sandbox Code Playgroud)
所需的效果是检查图标在图层可绘制的中心,而不进行缩放.问题是,上面的图层列表会导致检查图标缩放以适合图层大小.
如果我用每个密度的PNG替换矢量drawable并修改图层列表,我可以产生所需的效果:
<layer-list>
<item android:drawable="@color/grid_item_activated"/>
<item>
<bitmap android:gravity="center" android:src="@drawable/ic_check_white_48dp"/>
</item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)
我有什么方法可以使用VectorDrawable?
新的Android Billing v3文档和帮助程序代码startIntentSenderForResult()在启动购买流程时使用.我想从a开始购买流程(并收到结果)Fragment.
例如,文档建议调用
startIntentSenderForResult(pendingIntent.getIntentSender(),
1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0),
Integer.valueOf(0));
Run Code Online (Sandbox Code Playgroud)
和帮助程序代码调用
mHelper.launchPurchaseFlow(this, SKU_GAS, 10001,
mPurchaseFinishedListener, "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
Run Code Online (Sandbox Code Playgroud)
哪个叫startIntentSenderForResult().
问题是,在父节点上调用调用startIntentSenderForResult()原因而不是从调用它的位置(调用位置)调用原因.onActivityResult()ActivityFragmentIabHelper
我无法接受的onActivityResult()父Activity,然后手动调用onActivityResult()的Fragment,但有一种方法,使一个呼叫startIntentSenderForResult()从一个Fragment直接结果返回到Fragment的onActivityResult()?
我正在尝试DialogFragment使用自定义视图创建AlertDialog.必须从xml中扩充此视图.在我的DialogFragment班上,我有:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setTitle("Title")
.setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, null))
.setPositiveButton(android.R.string.ok, this)
.setNegativeButton(android.R.string.cancel, null)
.create();
}
Run Code Online (Sandbox Code Playgroud)
我尝试过其他通胀方法,.setView()例如:
.setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, (ViewGroup) getView(), false))
Run Code Online (Sandbox Code Playgroud)
和
.setView(getActivity().getLayoutInflater().inflate(R.layout.dialog, (ViewGroup) getTargetFragment().getView(), false))
Run Code Online (Sandbox Code Playgroud)
在显示此对话框的片段中设置目标片段之后.
所有这些尝试使我的自定义视图膨胀都会导致以下异常:
E/AndroidRuntime(32352): android.util.AndroidRuntimeException: requestFeature() must be called before adding content
E/AndroidRuntime(32352): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:214)
E/AndroidRuntime(32352): at com.android.internal.app.AlertController.installContent(AlertController.java:248)
E/AndroidRuntime(32352): at android.app.AlertDialog.onCreate(AlertDialog.java:314)
E/AndroidRuntime(32352): at android.app.Dialog.dispatchOnCreate(Dialog.java:335)
E/AndroidRuntime(32352): at android.app.Dialog.show(Dialog.java:248)
E/AndroidRuntime(32352): at android.support.v4.app.DialogFragment.onStart(DialogFragment.java:339)
E/AndroidRuntime(32352): at android.support.v4.app.Fragment.performStart(Fragment.java:1288)
E/AndroidRuntime(32352): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:873)
E/AndroidRuntime(32352): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1041)
E/AndroidRuntime(32352): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:625)
E/AndroidRuntime(32352): at …Run Code Online (Sandbox Code Playgroud) android android-inflate android-fragments layout-inflater android-alertdialog
我正在开发使用1.6 SDK的Android应用程序.我正在使用a TimePicker,当你点击中的数字时,我不希望软键盘出现TimePicker.我只想TimePicker使用加号和减号按钮进行更改.我尝试过使用android:focusable="false"并android:focusableInTouchMode="false"希望那些人会这样做,但他们似乎没有做任何事情.有没有办法做到这一点?
我在Android应用程序的sqlite数据库中存储了大量二进制数据(protobufs),却没有意识到Android Cursor只能容纳最多1MB的数据.我现在知道我应该将这些二进制blob存储在文件中,并且只引用sqlite数据库条目中的文件.
我需要升级数据库(应用程序已经使用了一段时间)才能将这些二进制块移动到文件中.问题是某些用户的数据可能已经超过了1MB的限制,我无法从数据库中检索它(访问Cursor包含大blob的单行的结果IllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialize before accessing data from it).
如何检索Cursor已存储在sqlite数据库中的大于1MB 限制的二进制blob ?
我想添加自己的框架代码,该代码在Android"system_server"中运行(处理所有系统级服务).我的服务加载了一个JNI库,该库与我添加到内核的驱动程序进行通信.该服务旨在允许应用程序向其注册侦听器以从驱动程序获取更新.我找到了一篇非常好的博客文章(http://www.androidenea.com/2009/12/adding-system-server-to-android.html),解释了如何添加系统服务,但我无法完全开始工作.
首先,帖子提到应该使用"适当的"Android.mk文件来编写客户端/测试应用程序,但是没有举例说明.当我尝试构建它时,我遇到构建错误,说它无法找到我添加的服务.有人能举例说明这可能是什么样的吗?
另外,我想在供应商目录(或froyo中的设备目录)中实现此功能,而不是在Android开源代码中实现.博客文章提到适当的地方是供应商目录,但没有举例说明这应该是什么样子.谁知道?
有关在Android中实施您自己的系统服务的任何其他信息都会有所帮助.我的具体工作流程是:
Android应用程序 - >系统服务 - > JNI(本机)库 - >设备驱动程序
我一直试图确定是否可以创建一个可观察的DialogFragment.基本上我希望能够:
DialogFragmentObservable可以订阅结果的rx (按下确定/取消,字符串输入,后台任务成功/失败等)到目前为止,我发现最接近的是ReactiveDialog,它曾经是RxAndroid的一部分,但是已经从v1.0.0中的RxAndroid中删除,作为简化RxAndroid的一部分.
虽然ReactiveDialog看起来确实符合我的前两个标准,但似乎没有处理配置更改.有两个问题需要考虑:
DialogFragment必须保持其Observable跨配置更改,因此它可以通知其状态的用户.我仍然是RxJava的新手,所以我仍然试图围绕你如何管理这样的事情.看起来它应该是可能的,但我觉得它需要一个静态或单独的Observable管理器,并且可能retainedInstance DialogFragments.
任何人对此有任何建议或最佳做法?
该注释@RequiresApi有助于要求仅在给定的 API 级别或更高级别上调用带注释的元素。然而,似乎没有相应的注释来要求仅在给定的 API 或更低版本上调用带注释的元素。
例如,给出类似的内容:
@RequiresMaxApi(28) // or @DeprecatedSinceAndroid(29)
fun doSomethingWithExternalStorage() {
val dir = Environment.getExternalStorageDirectory() // This is deprecated in API 29
// ...
}
Run Code Online (Sandbox Code Playgroud)
doSomethingWithExternalStorage()从不包含检查的代码调用,例如:
if (VERSION.SDK_INT < 29) {
doSomethingWithExternalStorage()
}
Run Code Online (Sandbox Code Playgroud)
如果没有上述 API 检查,doSomethingWithExternalStorage()将显示 lint 错误/警告,类似于如何@RequiresApi显示。
据我了解,这也和工作原理类似@DeprecatedSinceKotlin。
是否有现有的注释可以满足这些要求,或者是否有其他方法可以达到预期的结果?
android backwards-compatibility android-appcompat android-annotations androidx
Observable.fromCallable()非常适合将单个函数转换为Observable.但是,如何处理函数可能抛出的已检查异常?
我见过的大多数例子都使用lambdas和"just work".但是如果没有lambda,你会怎么做?例如,请参阅以下这篇精彩文章中的引用:
Observable.fromCallable(() -> downloadFileFromNetwork());
Run Code Online (Sandbox Code Playgroud)
现在这是一个单线程!它处理已检查的异常,没有更奇怪的Observable.just()和Observable.error()这样简单的事情就像推迟代码执行一样!
当我尝试在没有lambda表达式的情况下实现上面的Observable时,基于我见过的其他示例,以及Android Studio如何自动完成,我得到以下结果:
Observable.fromCallable(new Func0<File>() {
@Override
public File call() {
return downloadFileFromNetwork();
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果downloadFileFromNetwork()抛出一个已检查的异常,我必须尝试捕获它并将其包装在一个RuntimeException.必须有更好的方法!上面的lambda如何支持这个?!?!
在更新到最新的开发人员工具ADT 14之后,包含库项目的我的Android项目将不再运行产生错误:
Dx UNEXPECTED TOP-LEVEL EXCEPTION: ... already added: ...
...
Conversion to Dalvik format failed with error 1
Run Code Online (Sandbox Code Playgroud)
使用包含删除和重新添加项目的解决方案描述此问题的其他线程不起作用.