小编azi*_*ian的帖子

在SearchView中调节onQueryTextChange

"限制"的最佳方法是什么,onQueryTextChange以便我的performSearch()方法每秒只调用一次而不是每次用户输入?

public boolean onQueryTextChange(final String newText) {
    if (newText.length() > 3) {
        // throttle to call performSearch once every second
        performSearch(nextText);
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

java search android searchview android-search

9
推荐指数
4
解决办法
4505
查看次数

Retrofit 2:responseBodyConverter转换为null对象

我正在使用Retrofit的最新版本(截至2.0.0-beta4版本).当从服务器接收200 OK代码时,一切正常.但我也想处理不好的响应,例如代码401.所以,我必须得到错误响应代码,以确切地确定要执行的操作并显示适当的数据:

@Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
    if (response != null && !response.isSuccess() && response.errorBody() != null) {
        Converter<ResponseBody, APIError> errorConverter = retrofit.responseBodyConverter(APIError.class, new Annotation[0]);
        try {
            APIError error = errorConverter.convert(response.errorBody());
            Toast.makeText(getContext(), "code = " + error.getCode() + ", status = " + error.getStatus(), Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else if (null != response) {
        if (response.isSuccess()) {
            LoginResponse loginResponse = response.body();
            Toast.makeText(getContext(), "Successful login: " + loginResponse.getId(), Toast.LENGTH_SHORT).show();
        }
    } …
Run Code Online (Sandbox Code Playgroud)

error-handling android http retrofit retrofit2

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

类别偏好后的物料分隔符

我试图用物质主题来塑造我的喜好,而且几乎就在那里.

我导入了以下内容:

compile 'com.android.support:preference-v7:25.1.0'
compile 'com.android.support:preference-v14:25.1.0'
Run Code Online (Sandbox Code Playgroud)

然后在我的主应用主题中设置首选项主题:

<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
Run Code Online (Sandbox Code Playgroud)

我的偏好屏幕看起来很不错.我唯一的问题是类别没有空间或视觉分离,使得所有偏好看起来非常混乱.

材质设计文档显示的分隔符看起来像顶部和底部阴影(设备类别上方的IE):

几个问题:

  1. android提供这个吗?如果有,那么有更新的appcompat主题吗?或者其他我做错了什么?

  2. 如果android尚未在材质首选项主题中提供此分隔符,那么有人创建了它吗?我看到了这一点,他创建了一个带有自定义布局的新类别,PreferenceFragment中的类别之间的Divider.但我不完全确定如何创造所需的效果.

android android-preferences android-layout android-view material-design

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

在同一活动中RecyclerView项和CollapsingToolbar之间的共享元素动画

在我的应用程序中,我有一个通过RecyclerView适配器显示的项目列表.如果我点击一个项目Fragment,则在同一个项目中启动Activity.我的项目的布局和我的活动看起来(简化)像这样:

活动布局:

<android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

        <android.support.design.widget.CollapsingToolbarLayout>

            <ImageView
                android:id="@+id/image"
                android:transitionName="image" ... />

            <android.support.v7.widget.Toolbar ... />

        </android.support.design.widget.CollapsingToolbarLayout>

        <android.support.design.widget.TabLayout ... />

    </android.support.design.widget.AppBarLayout>

    <FrameLayout... />

</android.support.design.widget.CoordinatorLayout>
Run Code Online (Sandbox Code Playgroud)

物品布局:

<RelativeLayout >

    <ImageView
        android:id="@id/itemImage"
        android:transitionName="image" />

    <LinearLayout>

        <TextView ... />

        <TextView ... />

    </LinearLayout>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

现在,如果新片段通过项目点击开始,我想的物品图像的动画添加到ImageViewCollapsingToolbarLayout.我阅读有关ShareElement动画的文章,但这不适用于此,因为这不是真正的ShareElement动画.目标ImageView不在新片段中,我也不必开始新活动(我只ImageView在新的目标中显示目标Fragment).那么在这种情况下如何创建这样的动画呢?

animation android android-animation android-layout android-view

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

在状态栏下方显示DialogFragment内容

我试图显示一个带有match_parent的DialogFragment高度和宽度,但它发生在顶部,DialogFragment显示在StatusBar下面.

DialogFragment在底部,右侧,左侧和顶部应用了一些默认值.但顶部填充应从statusBar开始计数,而不是从总屏幕大小开始计算.

如何将DialogFragment设置为match_parent,但是在顶部,底部,右侧,左侧具有正常/默认填充?

android android-dialog android-windowmanager android-dialogfragment android-window

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

Kotlin和Java String之间的区别与Regex分开

如果我们有一个val txt: kotlin.String = "1;2;3;"并且喜欢将它拆分成数组,我们可以尝试以下方法:

val numbers = string.split(";".toRegex())
//gives: [1, 2, 3, ]
Run Code Online (Sandbox Code Playgroud)

尾随空String包含在结果中CharSequence.split.

另一方面,如果我们看一下Java String,结果是不同的:

val numbers2 = (string as java.lang.String).split(";")
//gives: [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

这次使用时java.lang.String.split,结果不包括尾随空String.这个行为实际上是给定相应的JavaDoc:

此方法的工作方式就像调用带有给定表达式和limit参数为零的双参数split方法一样.因此,结尾的空字符串不包含在结果数组中.

在科特林的版本,虽然,0也就是默认limit的文件的说法在这里,但内部科特林地图,0负的值-1时,java.util.regex.Pattern::split称为:

nativePattern.split(input, if (limit == 0) -1 else limit).asList()
Run Code Online (Sandbox Code Playgroud)

它似乎按预期工作但我想知道为什么该语言似乎限制Java API,因为0不再提供限制.

java regex string kotlin

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

findFragmentByTag的单元测试条件

Android Studio 3.2 Canary 2
Build #AI-173.4591728, built on February 8, 2018
JRE: 1.8.0_152-release-1024-b01 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Linux 4.14.18-300.fc27.x86_64
Run Code Online (Sandbox Code Playgroud)

我有以下活动,我想单元测试片段已经附加的情况,并应返回非null.并且应该落入其他条件:

这是我的活动:

public class BillingActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.billing_container);

        if(getSupportFragmentManager().findFragmentByTag(BillingView.TAG) == null) {
            final FragmentTransaction fragmentTransaction =
                    getSupportFragmentManager().beginTransaction();

            fragmentTransaction.add(
                    R.id.billing_view_container,
                    BillingView.newInstance(),
                    BillingView.TAG);

            fragmentTransaction.commit();
        }
        else {
            Timber.d("Fragment already attached");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试类是这样的:我可以编写测试来附加一个片段,但是我想在片段已经附加时测试条件并且应该返回非null.

class BillingActivityTest: BaseRobolectricTestRunner() {
    private lateinit var billingActivity: BillingActivity

    @Before
    fun setup() {
        billingActivity = …
Run Code Online (Sandbox Code Playgroud)

junit android unit-testing robolectric kotlin

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

进入多窗口模式时奇怪的生命周期回调排序

我遇到了RxJava,Retrofit和Multi-Window模式的问题......我在Activity中调用了我们自己的api和Retrofit(实际的代码比这复杂一点):

api.getEvent(...)
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidScheduler.mainThread())
  .subscribe(event -> setupUI(event),
             throwable -> showSnackbar(throwable));
Run Code Online (Sandbox Code Playgroud)

当应用程序处于"正常"模式(全屏)时,一切运行正常...我可以将应用程序放入bg,将其放回前台并再次调用api调用方法(它位于onResume方法中 - kind并且UI被绘制没有问题.当我激活多窗口模式时,调用onResume,成功调用api方法,但永远不会到达subscribe()方法.这种情况的堆栈跟踪是:

Retrofit: java.io.InterruptedIOException: thread interrupted
       at okio.Timeout.throwIfReached(Timeout.java:145)
       at okio.Okio$1.write(Okio.java:77)
       at okio.RealBufferedSink.flush(RealBufferedSink.java:221)
       at com.squareup.okhttp.internal.framed.Http2$Writer.flush(Http2.java:381)
       at com.squareup.okhttp.internal.framed.FramedConnection.newStream(FramedConnection.java:283)
       at com.squareup.okhttp.internal.framed.FramedConnection.newStream(FramedConnection.java:249)
       at com.squareup.okhttp.internal.http.Http2xStream.writeRequestHeaders(Http2xStream.java:135)
       at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:710)
       at com.facebook.stetho.okhttp.StethoInterceptor.intercept(StethoInterceptor.java:67)
       at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:695)
       at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:576)
       at com.squareup.okhttp.Call.getResponse(Call.java:287)
       at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:243)
       at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:205)                                                                     at com.squareup.okhttp.Call.execute(Call.java:80)
       at com.newrelic.agent.android.instrumentation.okhttp2.CallExtension.execute(CallExtension.java:43)
       at retrofit.client.OkClient.execute(OkClient.java:53)
       at com.newrelic.agent.android.instrumentation.retrofit.ClientExtension.execute(ClientExtension.java:42)
       at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:326)
       at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
       at retrofit.RestAdapter$RestHandler$1.invoke(RestAdapter.java:265)
       at retrofit.RxSupport$2.run(RxSupport.java:55)
       at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
       at retrofit.Platform$Android$2$1.run(Platform.java:142)
       at java.lang.Thread.run(Thread.java:761)
Run Code Online (Sandbox Code Playgroud)

应用程序不会崩溃但UI仍处于"占位符"状态,加载ProgressBar将永远消失.

编辑:我在其他活动中有相同的代码结构.但问题并没有出现在其他地方.

java android multi-window android-activity rx-java

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

gradle依赖关系树中asterix和箭头符号的含义

我已经运行gradlew命令来获取gradle依赖树.

gradlew.bat应用程序:依赖项

在输出时,我得到每个依赖项附加的不同类型的符号:

 com.twotoasters.servos:util-otto:1.0.0
 com.squareup.okhttp:okhttp:2.4.0 (*)
 com.android.support:recyclerview-v7:23.2.0 -> 25.0.0
Run Code Online (Sandbox Code Playgroud)

有些依赖项没有任何符号,有些依赖于(*)->.

这些符号是什么意思?

我试图搜索这个,但没有找到任何帮助.

java android gradle build.gradle android-gradle-plugin

8
推荐指数
2
解决办法
1001
查看次数

在BottomNavigationView中为导航项添加边距

我有一个BottomNavigationView我像这样实例化的:

BottomNavigationView navigationView = findViewById(R.id.bottom_navigation);
navigationView.setOnNavigationItemSelectedListener(this);
Run Code Online (Sandbox Code Playgroud)

/menu/menu.xml 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/first_id"
        android:icon="@drawable/home_icon"
        android:title="Item" />

    <item
        android:id="@+id/second_id"
        android:icon="@drawable/home_icon"
        android:title="Item" />

    <item
        android:id="@+id/third_id"
        android:icon="@drawable/home_icon"
        android:title="Item" />

    <item
        android:id="@+id/fourth_id"
        android:icon="@drawable/home_icon"
        android:title="Item" />
</menu>
Run Code Online (Sandbox Code Playgroud)

/drawable/home_icon 看起来像这样:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="#FFFFF0"
        android:pathData="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"
        android:strokeColor="#FFFFF0"
        android:strokeWidth="1" />
</vector>
Run Code Online (Sandbox Code Playgroud)

如您所见,导航项的按钮周围有边框,但是,边框相互接触。因此我想在菜单按钮之间添加一个边距。我怎样才能做到这一点?

在此处输入图片说明

从屏幕截图中也可以看出,我正在阻止切换模式。我通过调用来做到这一点

BottomNavigationViewHelper.removeShiftMode(navigationView);
Run Code Online (Sandbox Code Playgroud)

使用这里的代码。

按钮周围的边框已添加如下:

int stateListDrawable = drawableStateLists.get(currentFragment);
navigationView.setItemBackgroundResource(stateListDrawable);
Run Code Online (Sandbox Code Playgroud)

whilestateListDrawable指的是StateListDrawable当按下不同的菜单按钮时会发生变化的 a。的StateListDrawable指向XML选择这又是指一个xml形状像这样,例如:

<?xml version="1.0" encoding="utf-8"?> …
Run Code Online (Sandbox Code Playgroud)

java android android-layout android-view bottomnavigationview

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