小编Pio*_*ski的帖子

如果仅添加新表,则会进行会议室数据库迁移

不要假设,我有一个简单的房间数据库:

@Database(entities = {User.class}, version = 1)
abstract class AppDatabase extends RoomDatabase {
    public abstract Dao getDao();
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在添加一个新实体:Pet并将版本提升为2:

@Database(entities = {User.class, Pet.class}, version = 2)
abstract class AppDatabase extends RoomDatabase {
    public abstract Dao getDao();
}
Run Code Online (Sandbox Code Playgroud)

当然,Room会抛出异常: java.lang.IllegalStateException: A migration from 1 to 2 is necessary.

假设,我没有更改User类(因此所有数据都是安全的),我必须提供只创建新表的迁移.所以,我正在调查Room生成的类,搜索生成的查询以创建我的新表,复制它并粘贴到迁移中:

final Migration MIGRATION_1_2 =
        new Migration(1, 2) {
            @Override
            public void migrate(@NonNull final SupportSQLiteDatabase database) {
                database.execSQL("CREATE TABLE IF NOT EXISTS `Pet` (`name` TEXT NOT NULL, PRIMARY KEY(`name`))"); …
Run Code Online (Sandbox Code Playgroud)

java android database-migration android-room

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

在docker build期间在主机上执行命令

是否可以创建Dockerfile在构建映像时在主机上执行命令?

现在我在做:

./script_that_creates_magic_file.sh
docker build .
Run Code Online (Sandbox Code Playgroud)

使用Dockerfile:

FROM alpine
COPY magic_file
Run Code Online (Sandbox Code Playgroud)

我希望能够做到:

docker build .
Run Code Online (Sandbox Code Playgroud)

使用Dockerfile:

FROM alpine
# invoke script_that_creates_magic_file.sh on the host
COPY magic_file
Run Code Online (Sandbox Code Playgroud)

当然,此脚本与Dockerfile位于同一目录中.

docker dockerfile

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

如何在 Intellij 中使用 Kotlin 扩展功能指定 Live Template 的导入

我正在使用以下实时模板:

timber.log.Timber.debug { "$METHOD_NAME$" }
Run Code Online (Sandbox Code Playgroud)

其中debug是扩展函数:

package timber.log
inline fun Timber.debug(throwable: Throwable? = null, message: () -> String) {
  log(DEBUG, throwable, message)
}
Run Code Online (Sandbox Code Playgroud)

Intellijimport timber.log.Timber自动添加。是否可以timber.log.debug在 Intellij/Android Studio 中指定导入?

intellij-idea live-templates kotlin android-studio

12
推荐指数
0
解决办法
581
查看次数

LiveData的Android测试

我有这个模拟课:

class MockCategoriesRepository implements CategoriesRepository {
        @Override
        public LiveData<List<Category>> getAllCategories() {
            List<Category> categories = new ArrayList<>();
            categories.add(new Category());
            categories.add(new Category());
            categories.add(new Category());
            MutableLiveData<List<Category>> liveData = new MutableLiveData<>();
            liveData.setValue(categories);
            return liveData;
        }
    }
Run Code Online (Sandbox Code Playgroud)

和测试:

@Test
public void getAllCategories() {
    CategoriesRepository categoriesRepository = new MockCategoriesRepository();
    LiveData<List<Category>> allCategories = categoriesRepository.getAllCategories();
}
Run Code Online (Sandbox Code Playgroud)

我想测试List<Category>空.

我该怎么做?我可以使用Mockito吗?

android android-testing android-livedata

7
推荐指数
1
解决办法
4404
查看次数

使用Realm和try-with-resources是一个好习惯吗?

在许多地方,也有建议称Realm.getDefaultInstance()onCreate的方法Activity,并呼吁close在领域实例onDestroy(或演示者的相应方法).

但是,对我来说,使用Java的try-with-resources构造会更简洁:

try (final Realm realm = Realm.getDefaultInstance()) {
  // do stuff 
}
Run Code Online (Sandbox Code Playgroud)

清洁为什么?IMO可以更轻松地管理该范围的realm实例.在生命周期的一个时刻获取实例并在另一个实例中关闭实例,让我想起过去使用C++的过去,当我们不得不担心delete在正确的时刻调用时.

问题是:以这种方式使用Realm是一种不好的做法吗?为什么没有教程提到它?

java realm try-with-resources

6
推荐指数
1
解决办法
612
查看次数

返回RxJava的Completable方法的命名约定

我有一个带有视图类(FragmentActivity)的Android应用程序ViewModel

所述ViewModel自曝方法,如getUserName它返回Observable<String>。尽管也许有可能找到一个更好的名字(也许observeUserName),但我对当前的名字感到满意-这是可以解释的。

但是,这里开始了最困难的部分:ViewModel还可以告诉视图执行某些操作-例如关闭自身,弹出后退堆栈等。在这种情况下,ViewModel定义以下方法(和相应的Subject):

class ViewModel {
   // other methods, fields

   // ViewModel can call returnToPreviousScreen.onComplete()
   CompletableSubject returnToPreviousScreen = CompletableSubject.create();

   Completable returnToPreviousScreen() { return returnToPreviousScreen; }
}
Run Code Online (Sandbox Code Playgroud)

我认为该方法的名称很糟糕。我找不到更好的东西。诸如此类的observeWhenToReturnToPreviousScreen内容可能更具解释性,但难以阅读。

因此,是否有建议或命名方法来命名此类方法?

android naming naming-conventions rx-java reactive

6
推荐指数
1
解决办法
417
查看次数

展开CollapsingToolbarLayout时折叠内容而不是滚动

我用Android创建了一个简单的项目CollapsingToolbarLayout,这是它的结构(问题底部的完整布局源代码):

CoordinatorLayout
  AppBarLayout
    CollapsingToolbarLayout
      Toolbar
  RelativeLayout (layout_behavior="@string/appbar_scrolling_view_behavior")
    TextView (layout_alignParentTop="true")
    TextView (layout_alignParentBottom="true")
Run Code Online (Sandbox Code Playgroud)

当我展开/折叠栏时,视图会滚动,底部视图会超出屏幕: 在此输入图像描述

我将要实现的是以RelativeLayout底部文本始终可见的方式折叠/缩小(而不是滚动)内容(my ):

在此输入图像描述 在此输入图像描述

我怎么能在Android上做到这一点?

这是我的完整布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:toolbarId="@+id/toolbar">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay"/>

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:text="The text on the top"
            android:textSize="32sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:text="The text on the bottom"
            android:textSize="32sp"/>
    </RelativeLayout>

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

android android-collapsingtoolbarlayout

6
推荐指数
1
解决办法
1280
查看次数

何时使用菜单项id调用findViewById以确保它不为null?

我正在给菜单充气,并试图通过以下方式查找其中一个菜单项的视图:

 @Override
 public boolean onCreateOptionsMenu(final Menu menu) {
     getMenuInflater().inflate(R.menu.main, menu);

     // will print `null`
     Log.i("TAG", String.valueOf(findViewById(R.id.action_hello)));
     return true;
 }
Run Code Online (Sandbox Code Playgroud)

在结果null中打印在Logcat中.但是如果我在调用之前添加一些延迟findViewById,它将返回正确的View对象:

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(final Void... voids) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(final Void aVoid) {
            // will print correctly android.support.v7.view.menu.ActionMenuItemView...
            Log.i("TAG", String.valueOf(findViewById(R.id.action_hello)));
        }
    }.execute();
    return true;
}
Run Code Online (Sandbox Code Playgroud)

当然,这种解决方案非常脏,最小的延迟是未知的.有没有办法为菜单膨胀事件注册一些回调.换句话说:如何 …

android android-menu findviewbyid

6
推荐指数
1
解决办法
701
查看次数

Windows 上的 Android Lint 不考虑 lint-baseline.xml 中带有斜杠的文件 *nix 样式路径

我有一个有 Lint 问题的可绘制文件IconDipSize。此问题在lint-baseline.xmlmacOS 计算机上生成的文件中得到抑制,因此它包含带斜杠的文件路径,而不是 Windows 风格的反斜杠。

<?xml version="1.0" encoding="UTF-8"?>
<issues format="5" by="lint 4.0.1" client="gradle" variant="betaDebug" version="4.0.1">
    <issue
        id="IconDipSize"
        message="The image `download_icon.png` varies significantly in its density-independent (dip) size across the various density versions: drawable-hdpi/download_icon.png: 32x32 dp (48x48 px), drawable-mdpi/download_icon.png: 72x72 dp (72x72 px), drawable-xhdpi/download_icon.png: 48x48 dp (96x96 px), drawable-xxhdpi/download_icon.png: 48x48 dp (144x144 px), drawable-xxxhdpi/download_icon.png: 48x48 dp (192x192 px)">
        <location
            file="src/main/res/drawable-hdpi/download_icon.png"/>
        <location
            file="src/main/res/drawable-xxxhdpi/download_icon.png"/>
        <location
            file="src/main/res/drawable-xhdpi/download_icon.png"/>
        <location
            file="src/main/res/drawable-xxhdpi/download_icon.png"/>
        <location
            file="src/main/res/drawable-mdpi/download_icon.png"/>
    </issue>
</issues>
Run Code Online (Sandbox Code Playgroud)

这会导致 lint 忽略抑制并抛出错误:

> Lint found …
Run Code Online (Sandbox Code Playgroud)

android android-lint

6
推荐指数
0
解决办法
126
查看次数

使用 Serialized 作为 Android 导航组件的深层链接参数

Serializable使用深层链接时是否可以使用自定义对象作为片段参数?

我已经尝试了以下操作 - 在我的导航图 XML 文件中,我添加了以下几行:

<fragment
    android:id="@+id/eventFragment"
    android:name="com.myapp.EventFragment"
    android:label="EventFragment">

    <argument
        android:name="event"
        app:argType="com.myapp.EventId" />

    <deepLink app:uri="myapp://event/{event}" />

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

EventId可序列化数据类在哪里:

data class EventId(val value: Long) : Serializable
Run Code Online (Sandbox Code Playgroud)

然后,当我尝试使用 URL 运行应用程序时myapp://event/4002,会引发以下异常:

Caused by: java.lang.UnsupportedOperationException: Serializables don't support default values.
        at androidx.navigation.NavType$SerializableType.parseValue(NavType.java:834)
        at androidx.navigation.NavType$SerializableType.parseValue(NavType.java:787)
        at androidx.navigation.NavType.parseAndPut(NavType.java:96)
        at androidx.navigation.NavDeepLink.getMatchingArguments(NavDeepLink.java:99)
        at androidx.navigation.NavDestination.matchDeepLink(NavDestination.java:366)
        at androidx.navigation.NavGraph.matchDeepLink(NavGraph.java:79)
        at androidx.navigation.NavController.handleDeepLink(NavController.java:540)
        at androidx.navigation.NavController.onGraphCreated(NavController.java:499)
        at androidx.navigation.NavController.setGraph(NavController.java:460)
        at androidx.navigation.NavController.setGraph(NavController.java:425)
        at androidx.navigation.NavController.setGraph(NavController.java:407)
        at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:236)
Run Code Online (Sandbox Code Playgroud)

long用( )替换 typeapp:argType="long"解决了问题 - 没有例外,一切都按预期进行。

导航库似乎不知道如何将 URL 中的原始值转换为我的EventId类。是否可以以某种方式注册一个知道如何转换它的适配器?或者也许还有另一种解决方案?

android android-navigation android-architecture-navigation android-deep-link android-jetpack-navigation

5
推荐指数
1
解决办法
4041
查看次数