小编asc*_*sco的帖子

OnBackPressedDispatcher 的正确使用

有时,我想自己处理用户按下的后退按钮。我的(示例)代码如下所示:

class TestActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.test)
    }

    override fun onBackPressed() {

        if (checkSomeCondition()) {
            // do nothing
        } else {
            super.onBackPressed()
        }
    }

    private fun checkSomeCondition() = false
}
Run Code Online (Sandbox Code Playgroud)

当按下返回时我会收到通知,然后我决定是否要处理它,或者让系统通过调用 来处理它super.onBackPressed()

由于 onBackPressed() 现已弃用,我使用以下方法替换它OnBackPressedDispatcher

class TestActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.test)

        onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                if (checkSomeCondition()) {
                    // do nothing
                } else {
                    onBackPressedDispatcher.onBackPressed()
                }
            } …
Run Code Online (Sandbox Code Playgroud)

android

11
推荐指数
1
解决办法
5612
查看次数

Android:模拟长时间运行

我想当你快速尝试30分钟时,每个人都能体验到他的app工作.但是当一个应用程序在设备的背景中停留一天左右时,你得到了你的NullPointerExceptions东西并且事情没有按预期工作,因为Garbage Collector偷了你的东西.有没有办法模拟在后台运行很长时间的应用程序?

android

10
推荐指数
1
解决办法
808
查看次数

Android Studio:XML布局中的'wrap in container'

在编辑XML布局文件时,Eclipse有一个名为"wrap in container"的功能(Reformat - > Android - > ...),它允许您选择一个或多个Views并围绕它选择一个布局.Android Studio中有类似的东西吗?

eclipse android android-layout android-studio

10
推荐指数
2
解决办法
3067
查看次数

RxJava Observable在第一次发射时得到通知

我有三个Observables,我和combineLastest合并:

    Observable<String> o1 = Observable.just("1");
    Observable<String> o2 = Observable.just("2");
    Observable<String> o3 = Observable.just("3");

    Observable.combineLatest(o1, o2, o3, new Func3<String, String, String, Object>() {
        @Override
        public Object call(String s, String s2, String s3) {
            return null;
        }
    });
Run Code Online (Sandbox Code Playgroud)

我想通知其中一个Observable的第一次发射而不忽略后面的发射,我想第一个操作员会这样做.是否有一个方便的操作员(例如):

    o1.doOnFirst(new Func1<String, Void>() {
        @Override
        public Void call(String s) {
            return null;
        }
    })
Run Code Online (Sandbox Code Playgroud)

java reactive-programming rx-java

10
推荐指数
3
解决办法
2576
查看次数

在撰写 UI 测试中添加意图附加内容

我想对使用Jetpack Compose 的Activity 进行 UI 测试。该文档提供了有关如何使用两种变体测试此类屏幕的一些信息:

 @get:Rule val composeTestRule = createComposeRule()
Run Code Online (Sandbox Code Playgroud)

如果我不需要活动本身运行并且只想测试我的可组合项或

 @get:Rule val composeTestRule = createAndroidComposeRule<MyActivity>()
Run Code Online (Sandbox Code Playgroud)

如果我确实需要这项活动。

在第二种情况下,我如何将带有 Extras 的 Intent 传递给活动?

我试过了:

@Before
fun setUp() {
    composeTestRule.activity.intent = Intent().apply {
        putExtra(
            "someKey",
            123
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

但活动中的意图额外内容仍然为空。

android ui-testing android-jetpack-compose

10
推荐指数
1
解决办法
3437
查看次数

自定义ScrollView中的视图上的OnClickListener

我在ViewPager中有一个水平的ScrollView.为了防止在到达ScrollView结束时滚动ViewPager,我按照SO上的提示使用此类:

public class CustomScrollView extends HorizontalScrollView {

public CustomScrollView(Context p_context, AttributeSet p_attrs) {
    super(p_context, p_attrs);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent p_event) {

    return true;
}

@Override
public boolean onTouchEvent(MotionEvent p_event) {


    if (p_event.getAction() == MotionEvent.ACTION_MOVE
            && getParent() != null) {
        getParent().requestDisallowInterceptTouchEvent(true);
    }

    return super.onTouchEvent(p_event);
}
}
Run Code Online (Sandbox Code Playgroud)

onInterCeptTouchEvent似乎消耗任何点击该View和里面的一切.当我把ViewsScrollView,他们的OnClickListener旨意不会被调用.

当我让onInterceptTouchEventfalse返回false时,OnClickListener调用s,但ScrollView不能滚动.

如何在其中放置可点击的视图ScrollView

编辑:在实施Rotem的答案后,onClickListener工作,但它不仅触发点击事件,也触发其他人,如投掷.如何防止这种情况?

android

9
推荐指数
2
解决办法
2376
查看次数

@NonNull注释在Android Studio中不起作用

import android.support.annotation.NonNull;

public
@NonNull
Result handleFollowForwardResult(@NonNull Result tempResult, @NonNull Result oldResult) {
    return null;
}
Run Code Online (Sandbox Code Playgroud)

不会给出任何错误或警告?注释的重点不是要检查这个吗?

android android-studio

9
推荐指数
1
解决办法
3639
查看次数

android.test.AndroidTestCase中的方法setUp没有被模拟

我正在尝试使用Android Studio的新单元测试功能.我按照http://tools.android.com/tech-docs/unit-testing-support上的说明进行操作.那里的描述明确提到'方法...没有嘲笑'错误,并建议将以下内容放入build.gradle:

android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}
Run Code Online (Sandbox Code Playgroud)

这可以在从命令行启动时运行测试

gradlew test --continue
Run Code Online (Sandbox Code Playgroud)

但是当我使用rightclick - > run从Android Studio运行测试类时.这样,我又得到了同样的错误:

java.lang.RuntimeException: Method setUp in android.test.AndroidTestCase not mocked. See https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support for details.
    at android.test.AndroidTestCase.setUp(AndroidTestCase.java)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何想法?

编辑:测试类的内容并不重要,因为测试的setUp失败,我尝试了最简单的类:

public class ContactFormToolTest extends AndroidTestCase {    

    public void testSOmething(){
        assertEquals(false, true);
    }            
}
Run Code Online (Sandbox Code Playgroud)

也尝试重写setUp,没有任何区别.

android unit-testing android-studio

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

创建通知时罕见的RuntimeException

我有一个GcmListenerService侦听GCM消息,然后创建一个通知:

  public class MyGcmListenerService extends GcmListenerService {

    NotificationManager notificationManager;

    @Override
    public void onMessageReceived(final String from, final Bundle data) {
        super.onMessageReceived(from, data);

        notificationManager = (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);

        String title = data.getString("title");
        String messager = data.getString("message");

        Notification notification = new NotificationCompat.Builder(getApplicationContext())
                // set title, message, style etc
                .build();

        notificationManager.notify(0, notification);
    }
}
Run Code Online (Sandbox Code Playgroud)

一切都很标准.这对于成千上万的用户而言每天工作数千次.我确实通过Crashlytics收到了上述几行的以下崩溃:

致命异常:java.lang.RuntimeException无法在未调用Looper.prepare()的线程内创建处理程序

这种情况几乎完全发生在Android 6(98%)和制造商称为TCLCommunications的设备上.

任何人都已经经历过这样的事情,或者知道这是关于什么的?

从后台线程创建通知应该是完全可以的,对吧?

android android-notifications google-cloud-messaging

9
推荐指数
0
解决办法
250
查看次数

按下向下箭头时隐藏键盘

图为我的应用程序的一部分,AutoCompleteTextView附带适配器.当用户在该视图中输入内容时,会显示自动填充建议.

我遇到的问题是:当显示建议并按下设备的向下箭头时,只有AutoCompleteTextView关闭的建议被关闭,键盘保持打开状态,需要再次点击向下箭头才能消失.

我确实希望第一次点击向下箭头时建议键盘消失.

我尝试覆盖onBackPressed但是当向下箭头被敲击时它没有被调用,大概是因为它不被认为是"后退".

我怎么能这样做?

编辑:我知道如何以编程方式隐藏键盘,我想我的问题是检测'向下箭头'点击.

在此输入图像描述

android

8
推荐指数
1
解决办法
1216
查看次数