标签: android

动态添加视图后WRAP_CONTENT无法正常工作

我正在尝试创建一个动态显示一系列自定义视图的片段.此布局的主要内容是嵌套在LinearLayout中的RelativeLayout(以水平为中心),嵌套在ScrollView中.

RelativeLayout有一些TextView和一个9补丁ImageView,可以通过动态添加的自定义视图进行扩展.但是,图像(下面的achievement_bgImageView)最终会以屏幕大小结束,即使我添加了适当数量的自定义视图,也不会尊重其父RelativeLayout的大小.当我手动设置achievement_mainLayout的大小时,图像可以很好地缩放(请参阅下面注释掉的行),但如果我尝试让RelativeLayout的wrap_content处理自己的大小调整,则无效.

ScrollView IS尊重RelativeLayout的大小,因为所有内容都存在,它只是不伸展以匹配此时内容的imageView.

任何帮助将不胜感激...我的手动计算似乎不足以考虑不同的设备,尽管我考虑到屏幕密度,我手动强迫RelativeLayout到一个恒定的宽度.

值得注意的是,RelativeLayout的测量大小始终等于屏幕的高度,无论其内容的总和是大于还是小于该高度.所以,从本质上讲,WRAP_CONTENT根本就没有做它应该做的事情.我没有引用RelativeLayout的任何边缘,所以循环依赖应该不是问题.

fragment_achievements.xml

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true" >

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal">

        <RelativeLayout
                android:layout_width="320dp"
                android:layout_height="wrap_content"
                android:id="@+id/achievements_mainLayout">

            <ImageView
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:id="@+id/achievements_bgImageView"
                    android:src="@drawable/bkg_achievements9"
                    android:adjustViewBounds="true"
                    android:layout_marginLeft="8dp"
                    android:layout_marginTop="8dp"
                    android:layout_marginRight="8dp"
                    android:layout_centerHorizontal="true"
                    android:scaleType="fitXY"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Name Field"
                    android:id="@+id/achievements_nameTextView"
                    android:layout_alignParentTop="true"
                    android:layout_alignParentLeft="true"
                    android:layout_marginLeft="28dp"
                    android:layout_marginTop="30dp"/>

            <ImageView
                    android:layout_width="52dp"
                    android:layout_height="52dp"
                    android:id="@+id/achievements_avatarImageView"
                    android:layout_below="@+id/achievements_nameTextView"
                    android:layout_alignLeft="@+id/achievements_nameTextView"
                    android:src="@drawable/achieve_avatar"
                    android:layout_marginTop="5dp"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceSmall"
                    android:text="Top Moment:"
                    android:id="@+id/textView2"
                    android:layout_alignBottom="@+id/achievements_avatarImageView"
                    android:layout_toRightOf="@+id/achievements_avatarImageView"
                    android:layout_marginBottom="16dp"
                    android:layout_marginLeft="4dp"
                    android:textSize="12dp"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceSmall"
                    android:text="Me Overall:"
                    android:id="@+id/textView3"
                    android:layout_alignTop="@+id/textView2"
                    android:layout_alignLeft="@+id/textView2"
                    android:layout_marginTop="16dp"
                    android:textSize="12dp"/>

            <TextView
                    android:layout_width="52dp"
                    android:layout_height="wrap_content" …
Run Code Online (Sandbox Code Playgroud)

android android-layout

35
推荐指数
4
解决办法
2万
查看次数

Dalvik VM进程释放系统RAM吗?

Android开发者文档,作为Project Svelte的一部分(座右铭:"你曾尝试将Bugdroid装入紧身牛仔裤吗?!?"),有一个关于管理你的应用程序内存的页面.它包含:

当用户导航到其他应用并且您的UI不再可见时,您应该释放仅由您的UI使用的所有资源.此时释放UI资源可以显着提高系统缓存进程的容量,这直接影响用户体验的质量.

和:

TRIM_MEMORY_RUNNING_LOW:您的应用程序正在运行且不被视为可用,但设备的内存运行速度要低得多,因此您应该释放未使用的资源以提高系统性能(这会直接影响应用程序的性能).

等等.

但是,如果"释放资源"实际上会以某种方式影响系统RAM,这些只会有意义.

我的印象是Dalvik VM表现得像Java VM一样(或者可能"做",如果他们在我不看的时候改变了它).AFAIK,Java VM分配系统RAM以增加堆大小但从不释放它 - 一旦分配,只要进程运行,它仍然是堆空间的一部分.

如果Dalvik VM的行为方式相同,那么我无法看到如何增加流程中未分配的堆空间量会对整体系统性能产生任何影响.现在,为我们的进程释放堆空间是一件好事,也许这样做会降低我们将来需要更多系统RAM的可能性......但这不是文档所暗示的.文档指出"此时释放UI资源可以显着提高系统缓存进程的容量"; 它没有说"此时释放UI资源没有立竿见影的效果,但将来有助于减少应用程序的系统RAM占用空间".

现在,如果指令告诉我们释放通过NDK分配的内存,那将是有意义的,因为它发生在Dalvik堆之外并且会影响系统RAM.但是文档没有得出这种区别.

除了终止进程之外,Dalvik VM是否实际将已分配的RAM释放回系统?如果是的话,何时?而且,在较小的程度上,考虑到垃圾收集器是非压缩和非复制的,它是如何完成的?

谢谢!

android memory-management dalvik

35
推荐指数
1
解决办法
2487
查看次数

Android 4.3:如何连接多个蓝牙低功耗设备

我的问题是:Android 4.3(客户端)可以与多个BLE设备(服务器)建立活动连接吗?如果是这样,我该如何实现呢?

到目前为止我做了什么

我尝试使用BLE和Android 4.3 BLE API评估您可以实现的吞吐量.此外,我还尝试找出可以同时连接和激活的设备数量.我使用Nexus 7(2013),Android 4.4作为主设备,TI CC2540 Keyfob作为从设备.

我为奴隶编写了一个简单的服务器软件,它通过BLE通知传输10000个20Byte数据包.我将我的Android应用程序基于Bluetooth SIG 的Application Accelerator.

它适用于一个设备,我可以在7.5 ms的连接间隔内实现大约56 kBits的有效载荷吞吐量.为了连接多个奴隶,我遵循了在北欧开发者区撰写的北欧员工的建议:

是的,可以使用单个应用程序处理多个从属服务器.您需要使用一个BluetoothGatt实例处理每个从属设备.对于您连接的每个从站,您还需要特定的BluetoothGattCallback.

所以我尝试了它,部分工作.我可以连接到多个奴隶.我也可以注册多个奴隶的通知.当我开始测试时,问题就开始了.我首先收到来自所有从站的通知,但是经过几次连接间隔后,只有来自一个设备的通知才会通过.大约10秒后,其他从属设备断开连接,因为它们似乎达到连接超时.有时我从测试开始就收到来自一个奴隶的通知.

我也尝试通过读取操作访问该属性,结果相同.在几次读取之后,只有一个设备的答案来了.

我知道在这个论坛上有一些类似的问题:Android 4.3是否支持多个BLE设备连接?,原生Android BLE GATT实现同步性吗?Ble多重连接.但是,如果有可能以及如何做到这一点,这些答案都没有让我清楚.

我非常感谢你的建议.

android bluetooth-lowenergy

35
推荐指数
3
解决办法
6万
查看次数

错误=无法找到以下内容的检测信息:ComponentInfo {}

我想尝试espresso测试,但我一直收到这个错误:

INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.mikeestrada.test/android.test.InstrumentationTestRunner}
Run Code Online (Sandbox Code Playgroud)

它工作过一次,但我无法正确地重新创建报告.他们只是空白,没有测试任何东西.我尝试了很多命令,包括

adb shell am instrument -w -r com.mikeestrada.test/android.test.InstrumentationTestRunner
Run Code Online (Sandbox Code Playgroud)

adb shell am instrument -w -r   com.mikeestrada.test/com.google.android.apps.common.testing.testrunner.GoogleInstrumentation TestRunner
Run Code Online (Sandbox Code Playgroud)

这是我的代码片段:

AndroidManifest.xml中

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapplication"
        android:versionCode="1"
        android:versionName="1.0" >

        <uses-sdk
            android:minSdkVersion="7"
            android:targetSdkVersion="19" />

        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.myapplication.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
                <instrumentationandroid:name="com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"                   
    android:targetPackage="com.mikeestrada.test"/>
Run Code Online (Sandbox Code Playgroud)

TestStartScreen.java

    package com.mikeestrada.test;

    import android.test.ActivityInstrumentationTestCase2;
    import android.test.ActivityUnitTestCase;
    import android.test.AndroidTestCase;
    import android.test.suitebuilder.annotation.LargeTest;
    import android.view.View;

    import com.example.myapplication.MainActivity;
    import com.example.myapplication.R; …
Run Code Online (Sandbox Code Playgroud)

java android android-espresso

35
推荐指数
3
解决办法
3万
查看次数

Proguard在Parcelable类中导致RuntimeException(解组未知类型代码)

如果我离开我的应用程序并在一段时间后打开它,我会收到此异常.我的主要活动包括一个包含三个不同片段的ViewPager.我也在Application类中做了一些我不认为与问题有关的东西.

这是例外:

RuntimeException(@Parcel:readValue:2065){无法启动活动ComponentInfo {com.emu/com.emu.ActivityMain}:java.lang.RuntimeException:Parcel android.os.Parcel@419526d0:在332处解组未知类型代码2131361816 }

我发现谷歌分析中的用户手机上发生了很多这种异常.所有这些都是相同的,除了@v之后的数字和@之后的十六进制数,在上面的异常中是2065和419526d0.

该异常并未指出任何代码行.我搜索了这个,似乎与错误写入包裹有关.虽然我的MainActivity中没有任何包裹.我不知道是什么原因引起的.

---编辑---------------------------------------------- --------------------------

我转载了例外.它发生在应用程序离开主页按钮,并在打开其他内存消耗应用程序后从内存中清除.再次启动它时会发生异常.直到现在我才认为从最近的任务或从DDMS关闭应用程序具有相同的效果,但显然它没有.

@EricWoodruf帮我发现包裹在进口图书馆的某个地方.我在PagerSlidingTabStrip中找到了我从网上下载的包裹.这是与包裹相关的代码,但我真的不知道这里有什么问题:

public class PagerSlidingTabStrip extends HorizontalScrollView
{
    @Override
    public void onRestoreInstanceState(Parcelable state)
    {
        SavedState savedState = (SavedState) state;
        super.onRestoreInstanceState(savedState.getSuperState());
        currentPosition = savedState.currentPosition;
        requestLayout();
    }

    @Override
    public Parcelable onSaveInstanceState()
    {
        Parcelable superState = super.onSaveInstanceState();
        SavedState savedState = new SavedState(superState);
        savedState.currentPosition = currentPosition;
        return savedState;
    }

    static class SavedState extends BaseSavedState
    {
        int currentPosition;

        public SavedState(Parcelable superState)
        {
            super(superState);
        }

        private SavedState(Parcel in)
        {
            super(in);
            currentPosition = in.readInt();
        }

        @Override
        public …
Run Code Online (Sandbox Code Playgroud)

android

35
推荐指数
1
解决办法
2万
查看次数

粘性前台服务无法重新启动,并显示"进程错误"错误

我有一个已启动的前台服务.我已经注意从onStartCommand返回START_STICKY.我观察到前台服务无法无限期运行,但会被称为的Android内部模块定期终止onStartCommand.本质上是一个进程LRU被维护,如果它被配置为这样做(粘性或非粘性),则新终止的服务将再次被调度.我面临的问题是如何处理重启.Logcat表示正在传递服务意图,但由于"进程不好"而失败

在浏览其他来源后,我被引导相信我的服务中存在内存泄漏.为了验证这个声明,我创建了一个vanilla前台服务,除了RestartProcessManager在同一个应用程序中记录语句之外什么也没做.这也发现了同样的问题.

在一个新项目中尝试了完全相同的东西(显然有一个新的包名),服务重启完全正常.另外,我通过单击studio-> logcat下的红色十字按钮来模拟重启(这实际上会杀死进程).无论如何,这次服务意图成功交付,服务再次启动并运行.我认为它可能是我项目中的一些依赖项,可能会以某种方式搞乱.我在新项目中复制了依赖项,并继续按预期工作.

现在这是荒谬的地方.我更改了错误项目中的包名称,我不再遇到问题了.我已经解决了这个问题,因为我花了将近2天的时间对此进行诊断,但更改软件包名称对我来说是不可行的,因为我的应用程序已经发布了.

编辑-1:我必须提一下,我在运行Oreo的设备上观察到这一点(一加5)

编辑-2:服务在与应用程序相同的过程中运行.我也包括了logcat转储.

02-15 14:26:50.850  1395  1445 D RestartProcessManager: updateSelf :  com.ambee, size : 30
02-15 14:26:50.852  1395  1445 D RestartProcessManager: com.ambee got score 26.17240489145331 in DayDuration for duration : 525176
02-15 14:26:50.853  1395  1445 D RestartProcessManager: com.ambee got score 99.80218232889891 in DayLRU for LRU diff : 47707034
02-15 14:26:50.853  1395  1445 D RestartProcessManager: com.ambee got score 90.9090909090909 in DayLaunchTimes for launch times : 10
02-15 14:26:50.854  1395  1445 D RestartProcessManager: com.ambee …
Run Code Online (Sandbox Code Playgroud)

java service android foreground-service

35
推荐指数
1
解决办法
1278
查看次数

LocationRequest构造函数标记为内部

我正在尝试使用我的Android应用程序设置位置更新com.google.android.gms:play-services-location:12.0.0,但是我收到以下错误:

LocationRequest构造函数标记为内部,不应从应用程序访问

我的位置更新请求如下所示:

locationClient.requestLocationUpdates(
    new LocationRequest()
        .setInterval(5000)
        .setFastestInterval(1000)
        .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY),
    locationCallback,
    null
);
Run Code Online (Sandbox Code Playgroud)

我已经按照文档示例进行操作,它们以相同的方式执行.如果我不应该打电话new LocationRequest(),那么正确的方法是什么?

java android location

35
推荐指数
2
解决办法
9474
查看次数

IOException:升级到Android Studio 3.1时无法找到字节代码

昨天,谷歌宣布Android Studio 3.1现在可以在稳定发布渠道下载.所以我决定尝试一下.

在此之前,我的项目已成功构建,但在我将AS升级到com.android.tools.build:gradle:3.1.0gradle构建工具并com.android.tools.build:gradle:3.1.0(它强制升级gradle包装器4.4)后,它失败并出现以下异常:

java.lang.RuntimeException: com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: java.io.IOException: Failed to find byte code for android/hardware/camera2/CameraManager$TorchCallback
    at com.android.builder.profile.Recorder$Block.handleException(Recorder.java:55)
    at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:104)
    at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:212)
    at sun.reflect.GeneratedMethodAccessor309.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:46)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:121)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:110)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
    at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
    at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:60)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:97)
    at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:87)
    at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
    at …
Run Code Online (Sandbox Code Playgroud)

android android-studio android-gradle-plugin android-studio-3.1

35
推荐指数
3
解决办法
2万
查看次数

java.lang.IllegalArgumentException:此组件要求您指定有效的android:textAppearance属性

我在我的一个布局文件中有一个com.google.android.material.button.MaterialButton组件,当我使用最新版本的Material Components库时,我收到此错误(com.google.android.material:material:1.0 0.0-素α3):

java.lang.IllegalArgumentException:此组件要求您指定有效的android:textAppearance属性.

它不存在于1.0.0-alpha1中.这是库中的错误还是我现在应该只指定textAppearance属性?

android material-components material-components-android

35
推荐指数
5
解决办法
2万
查看次数

在flutter应用程序中添加日期选择器的正确方法是什么?

在我的应用中,我正在创建注册页面,我需要在其中添加DOB。我想在其中添加日期选择器,但我没有正确的方法来执行此操作。

android ios flutter dart-2 flutter-layout

35
推荐指数
5
解决办法
3万
查看次数