不要假设,我有一个简单的房间数据库:
@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) 是否可以创建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位于同一目录中.
我正在使用以下实时模板:
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 中指定导入?
我有这个模拟课:
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吗?
在许多地方,也有建议称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是一种不好的做法吗?为什么没有教程提到它?
我有一个带有视图类(Fragment,Activity)的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创建了一个简单的项目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) 我正在给菜单充气,并试图通过以下方式查找其中一个菜单项的视图:
@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)
当然,这种解决方案非常脏,最小的延迟是未知的.有没有办法为菜单膨胀事件注册一些回调.换句话说:如何 …
我有一个有 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) 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
android ×7
java ×2
android-architecture-navigation ×1
android-collapsingtoolbarlayout ×1
android-lint ×1
android-menu ×1
android-room ×1
docker ×1
dockerfile ×1
findviewbyid ×1
kotlin ×1
naming ×1
reactive ×1
realm ×1
rx-java ×1