我有一个奇怪的问题,在返回应用程序时没有更新SharedPreferences.这是场景:
我有两个使用相同共享首选项的项目.Project1和Project2.它们是独立但相关的应用程序.它们使用相同的密钥签名,并使用sharedUserId来共享信息.
Project1打开Project2.
Project2检索SharedPreferences文件并通过此方法写入它:
Context prefsContext = c.createPackageContext(packageNameOfProject1, Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences prefs = prefsContext.getSharedPreferences(fileName, Context.MODE_PRIVATE);
SharedPreferences.editor editor = prefs.edit();
editor.putBool("bool1", value1);
editor.putBool("bool2", value2);
...
editor.putBool("boolN", valueN);
editor.apply();
Run Code Online (Sandbox Code Playgroud)
完成后,我通过调用返回Project1 finish()
.
然后Project1读取数据,如下所示:
SharedPreferences prefs = getSharedPreferences(getPreferencesFileName(), Context.MODE_PRIVATE);
Boolean value1 = prefs.getBoolean(fileName, false);
Boolean value2 = prefs.getBoolean(fileName, false);
...
Boolean valueN = prefs.getBoolean(fileName, false);
Map<String, ?> mappings = prefs.getAll();
Set<String> keys = mappings.keySet();
for(String key : keys) {
log.d(TAG, "_____");
log.d(TAG, "Key = " + key);
log.d(TAG, "Value = " + mappings.get(key));
} …
Run Code Online (Sandbox Code Playgroud) 目前我有一个ImageView
扩展设备的长度,并缩放3.显然,在屏幕外侧面裁剪.我希望动画与设备的左侧图像的左侧开始,然后在转移,直到图像的右侧是在设备的右侧.
我可以通过将图像设置为它的初始基础来实现它们,然后基本上这样做:
<objectAnimator
android:propertyName="translationX"
android:duration="6000"
android:valueTo="-1280"
android:valueType="floatType"
/>
Run Code Online (Sandbox Code Playgroud)
但是,这只能起作用,因为我知道图像的确切尺寸以及我的摩托罗拉Xoom的确切尺寸.当然,我希望这可以在任何设备上工作,所以我需要一些不太硬编码的东西.使用Tween动画,它可以正常工作,因为您可以根据其大小的百分比来翻译某些内容.它并不完美,但它对这种效果起到了很好的作用.财产动画似乎没有这个.在translationX
和X
属性必须有单位.
有没有一种简单的方法来根据相对位置转换具有属性动画的视图?我是否必须为每个维度制作单独的动画文件?有没有其他方法可以实现这种效果?我不想制作自己的动画.
据我们所知,打字稿允许我们声明部分类型,但是当我们要检查我的属性是否在 keyof 类型中时该怎么办?让我们来看看
interface Car {
Brand: string;
Model: string;
}
type KeyofCar = keyof Car; // Brand, Model
if('Brand' is in KeyofCar) {
something...
} // I know it doesn't work but it is pseudocode
Run Code Online (Sandbox Code Playgroud)
有什么办法可以查到吗?
我正在使用BasicManagedProfile示例,并希望仅将自定义应用程序安装到托管配置文件.我可以轻松访问Play商店,下载并安装应用程序,它只会显示在工作资料的应用程序中.
但是,使用标准的Intent方法从设备安装apk似乎不起作用.
final Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setDataAndType(Uri.fromFile(new File(APK_LOC)), "application/vnd.android.package-archive");
intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true);
intent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, getPackageName());
startActivityForResult(intent, REQUEST_INSTALL, null);
Run Code Online (Sandbox Code Playgroud)
与正常情况一样,如果未启用"从未知来源安装"安全设置,则会弹出一个对话框,将您转到"设置"应用以启用它.但是,在托管配置文件应用程序中,无论是否选中该安全设置,都会弹出此对话框.似乎设置没有反映在托管配置文件中(这是有道理的,因为它是一个完全独立的设置数据库).
我试过直接打开"设置"应用,但它仍然是相同的.它只是转到标准设置应用程序而不是托管配置文件设置应用程序.
有没有办法更改托管配置文件的此安全设置或从配置文件所有者应用程序安装应用程序?由于我的应用是个人资料所有者,因此似乎应该允许这样做.系统应用程序很容易实现,但第三方应用程序无法使用该DevicePolicyManager#enableSystemApp()
方法.
编辑:
我还尝试从管理配置文件Gmail应用程序进行安装.一样.似乎无法在托管配置文件中在Google Play商店之外安装应用.
在我的应用程序中,我正在尝试设置相机.我的类扩展了SurfaceView并实现了SurfaceHolder.Callback方法.
这是我班上的一些内容:
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder mHolder;
private Camera.Parameters cameraParameters;
private Camera camera;
public CameraPreview(Context context) {
super(context);
mHolder = this.getHolder();
mHolder.addCallback(this);
// If this is deprecated, why do I still need it?
// It says deprecated, but app crashes when removed.
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
Camera.Size previewSize = previewSizes.get(0);
parameters.setPreviewSize(previewSize.width, previewSize.height);
camera.setParameters(parameters);
try {
camera.stopPreview();
camera.setPreviewDisplay(mHolder); …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序,其唯一目的是尝试了解Android中的视图层次结构的工作原理.我现在遇到了一些非常棘手的问题.我将在这里解释一下我的解释.
建立:
目前我有三个观点.2是ViewGroups
1和1只是一个View
.让我们说它们按顺序排列:
TestA extends ViewGroup
TestB extends ViewGroup
TestC extends View
TestA->TestB->TestC
Where TestC is in TestB and TestB is in TestA.
Run Code Online (Sandbox Code Playgroud)
在我看来Activity
我只是这样显示视图:
TestA myView = new TestA(context);
myView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
setContentView(myView);
Run Code Online (Sandbox Code Playgroud)
问题:
onDraw(Canvas canvas)
从不调用TestA 的方法.我已经看到了一些解决方案,说我的视图没有任何尺寸(高度/宽度= 0),但事实并非如此.当我覆盖时onLayout()
,我得到了布局的尺寸,它们是正确的.此外,getHeight()/ Width()完全符合它们的要求.我也可以覆盖dispatchDraw()
并获取我的基本视图来绘制自己.
我想动画一个物体TestB
.传统上,我会覆盖onDraw()
调用方法,invalidate()
直到对象完成它应该做的动画.但是,TestB
当我调用invalidate()
视图时,永远不会重绘.我的印象是我的父视图的工作是onDraw()
再次调用该方法,但我的父视图不再调用它dispatchDraw()
.
我想我的问题是,为什么onDraw()
我的父视图的方法永远不会被调用开始?我的父视图中的哪些方法应该在其中一个孩子使自己无效时被调用?父母负责确保孩子被吸引或者Android会照顾吗?如果Android响应invalidate()
,为什么我TestB
再也不会被吸引?
我有一个包含一系列声音文件的扩展文件。较长的为 .mp3 文件,较短的音效为 .wav 文件。我将它们打包在 .zip 文件中,未进行压缩。我使用 Google 提供的 Zip 文件阅读器和下载器库。
我像这样打开声音文件:
MediaPlayer mPlayer;
...
AssetFileDescript asd = expansionFile.getAssFileDescriptor(fileName);
FileDescriptor soundFile = asd.getFileDescriptor();
mPlayer = new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(soundFile);
mPlayer.prepare();
mPlayer.start();
Run Code Online (Sandbox Code Playgroud)
奇怪的是它每次都播放相同的声音文件。它似乎是它首先发现的任何东西。asd.getDeclaredLength()
和的字节大小asd.getLength()
正是它应该的大小。这意味着文件描述符至少找到了文件,但由于某种原因 MediaPlayer 播放它决定的任何随机文件。
我在这里到底缺少什么?任何帮助将不胜感激。
谢谢。
android android-mediaplayer android-resources apk-expansion-files
我想问一下如何更改布局以获取将ID rowType设置为绝对正确位置的TextView.目前我已将引力设置为右,但当前设置在上面的TextView右侧(id:row)对齐.因此,如果TextView行在屏幕的一半结束,TextView rowType结束于一半...
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/notepad_paper">
<TableRow
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fadingEdge="vertical"
android:fadeScrollbars="true"
android:gravity="left"
android:layout_gravity="left|center_horizontal">
<ImageView
android:id="@+id/rowImgFav"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:padding="5dp"
android:paddingLeft="20dp"
android:paddingRight="40dp"
android:scrollbars="vertical"
android:fadingEdge="vertical"
android:layout_alignParentRight="true"
/>
<ImageView
android:id="@+id/rowImg"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:padding="5dp"
android:scrollbars="vertical"
android:fadingEdge="vertical"
android:layout_alignParentRight="true"
/>
<TableLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TableRow
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/row"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:paddingLeft="10dp"
android:paddingBottom="0dp"
android:textSize="14dp"
android:textStyle="bold"
android:textColor="@color/notepad_text" />
</TableRow>
<TableRow>
<TextView
android:id="@+id/rowType"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:padding="0dp"
android:paddingTop="2dp"
android:textSize="10dp"
android:textStyle="normal"
android:gravity="right"
android:textColor="@color/notepad_text" />
</TableRow>
</TableLayout>
</TableRow>
</TableLayout>
Run Code Online (Sandbox Code Playgroud) 我正在解析自定义属性,遇到了一些奇怪的事情。假设我的解析器看起来像这样:
final TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.Item);
final int size = attributes.getIndexCount();
for(int i = 0; i < size; i++) {
final int attr = attributes.getIndex(i);
if(attr == R.styleable.Item_custom_attrib) {
final int resourceId = attributes.getResourceId(attr, -1);
if(resourceId == -1)
throw new Resources.NotFoundException("The resource specified was not found.");
...
}
attributes.recycle();
Run Code Online (Sandbox Code Playgroud)
这可行。现在,如果我将第2行替换为final int size = attributes.length();
这意味着我得到了:
final TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.Item);
final int size = attributes.length();
for(int i = 0; i < size; i++) {
final int attr …
Run Code Online (Sandbox Code Playgroud) 我正在写一个自定义类.在实际绘制之前,需要为某些预处理和大小调整计算位图.位图本身是预处理的9补丁图像.在构造函数中,有以下代码:
BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
bmpOptions.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), BITMAP_ID, bmpOptions);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), BITMAP_ID);
Log.d(getClass().getSimpleName(), "width: " + bmp.getWidth() + " " + bmpOptions.outWidth + "; height: " + bmp.getHeight() + " " + bmpOptions.outHeight);
Run Code Online (Sandbox Code Playgroud)
运行Android 3.2.2的7"三星Galaxy Tab 7上的输出:
宽度:556 556; 身高:890 890
运行Android 4.1的10"Motorola Xoom上的输出:
宽度:556 556; 身高:890 890
运行Android 4.2.2的7"Nexus 7上的输出:
宽度:740 834; 高度; 1185 1335
位图的实际尺寸为:
mdpi:558 x 892
hdpi:836 x 1337
位图是预处理的9补丁,这就是尺寸偏离2个像素的原因.我无法理解为什么Nexus 7上的hdpi资产会产生很大的影响.
我也试过这些配置:
bmpOptions.inScaled = false;
Run Code Online (Sandbox Code Playgroud)
和
bmpOptions.inTargetDensity = getResources().getDisplayMetrics().densityDpi;
Run Code Online (Sandbox Code Playgroud)
和
bmpOptions.inTargetDensity …
Run Code Online (Sandbox Code Playgroud) 我继承了一个包含MongoDB服务器中大量数据的项目.我正在为它写一些查询,并遇到了一个相当烦人的问题.我需要找到我们称之为的唯一值的数量ID
.问题是,根据这些数据的来源,它们可能出现在两个不同的点上.
例如,表格看起来像这样:
{
foo: {
ID: "ABC123"
},
bar: {
ID: undefined
}
}
Run Code Online (Sandbox Code Playgroud)
要么
{
foo: {
ID: undefined
},
bar: {
ID: "ABC123"
}
}
Run Code Online (Sandbox Code Playgroud)
要么
{
foo: {
ID: "ABC123"
},
bar: {
ID: "ABC123"
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我现在无法重新建模数据.我对MongoDB的了解相当有限.我想知道是否有一种方法可以使用聚合将这些连接在一起,因此我将所有ID集合到一个Document中,因此它们都是唯一的.将一个或另一个组合起来相当微不足道,但将两者分组都会给我重复.
android ×9
alignment ×1
android-view ×1
crash ×1
deprecated ×1
mongodb ×1
surfaceview ×1
typescript ×1