我目前的目标是在我的数据中建立一对多的关系。
从各种教程中,我了解到我有两种主要的方法来做到这一点。
创建两个实体并让孩子使用@ForeignKey
注释
创建这两个实体和一个额外的 POJO,@Embedded
用于父实体并将子实体@Relation
列表绑定到 父实体
因此,使用 Relation 似乎是额外的努力。或者我错过了什么?
Relation 的一大优势是:
当 Pojo 从查询中返回时,它的所有关系也由 Room 获取。
第一种方法哪个不那么容易?
我有每隔几天发送一次的提醒通知。
该通知的发送由重复触发AlarmManager
。该通知本身是建立在onReceive
我的BroadcastReceiver
(如描述在这里)。所以当onReceive
被触发时,应用程序甚至没有打开/运行。
现在我想访问我的(本地)SQLite 数据库并获得正确的内容来构建通知,但是我如何ViewModelProvider
在这个地方获得一个(代码中的 xxx)来访问我的ViewModel
?
public void onReceive(Context context, Intent intent) {
NotificationViewModel viewModel =
ViewModelProviders.of(XXX).get(NotificationViewModel.class);
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
或者问一个更好的问题,这甚至是好的做法吗?
另一种可能性是PendingIntent
将触发 的所有内容填充到 中onReceive
,因此我可以在收到后一一检索它。但这会更难,因为它是一个重复的警报,每次都需要不同的内容,但只触发一次。
我查看了一些搜索结果,但它们没有解决我的问题:
读取LiveData 超出 ViewModel [...],据说
如果您的应用程序的一部分不影响 UI,则您可能不需要 LiveData。
所以这意味着我应该简单地使用上下文访问我的存储库并从中获取原始数据, …
截至最近,底部导航栏开始在文本和图标之间包含一些奇怪的空间(我认为在更新依赖项之后):
现在图标和文本之间似乎有一个间隔符,它将两者推到了栏的最末端。到目前为止,我发现的只是尝试app:itemPaddingTop
手动将图标推回原处,但这会破坏较小设备上的视图。
这是 XML:
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="?android:attr/windowBackground"
app:itemBackground="@color/darkGalaxy"
app:itemIconTint="@color/bottom_nav_color_selector"
app:itemTextColor="@color/bottom_nav_color_selector"
app:labelVisibilityMode="labeled"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHeight_default="percent"
app:layout_constraintHeight_percent="0.1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/bottom_nav_menu" />
Run Code Online (Sandbox Code Playgroud)
有没有办法让它们都以最小的边距垂直居中?
我正在尝试使用a Scanner
和a 从输入中读取指定的文件格式Pattern
,如下所示:
Pattern p = Pattern.compile("\\d+\\sx\\s\\d+");
Scanner sc = new Scanner(System.in);
String input = "";
try {
input = sc.next(p);
} catch(NoSuchElementException ne) {
System.out.println("No such token");
}
sc.close();
System.out.println(input);
Run Code Online (Sandbox Code Playgroud)
但是当我1 x 1
用作输入时,它会抛出NoSuchElementException
模式\\d+x\\d+
,输入1x1
它可以工作,但模式中没有空格,我做错了吗?
我不明白为什么Eclipse在第二个if条件中给出了代码的死代码警告:
boolean frameErreicht = false;
while (!frameErreicht) {
String line = reader.readLine();
if (line.matches("@\\d*")) {
reader.mark(reader.getLineNumber() - 1);
reader.setLineNumber(reader.getLineNumber() - 1);
frameErreicht = true;
}
if (line == null)
throw new IOException("Keine Angaben zu Frames im Eingabestrom");
}
Run Code Online (Sandbox Code Playgroud)
LinenumberReader的readLine()方法的jdoc表示null
如果到达流的末尾它将返回,所以如果在整个text(line == null
)中找不到匹配,它应该抛出异常.
但是怎么了?
我有这个简单的例子
<table border="1px">
<tr>
<td> </td>
<td> <input type="button" value="Click" onclick="insertText()"/> </td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
我想获得(第一个)tr元素的第一个td元素,我试过:
var td = document.getElementsByTagName("table")[0].children[0].children[0];
Run Code Online (Sandbox Code Playgroud)
因为它是:
var td = document.getElementsByTagName("table")[0]
对于表元素本身children[0]
对于tr元素children[0]
再次为第一个TD元素 这就是我的想法,但显然这会让我返回tr元素而只添加另一个.children[0]
让我获得td元素.
var td = document.getElementsByTagName("table")[0].children[0].children[0].children[0];
Run Code Online (Sandbox Code Playgroud)
为什么这样,或者我错过了什么?
基于这个问题:SwiftUI - Drawing (curved) paths between view
我使用 绘制所需的视图和路径GeometryReader
。问题是,现在屏幕变得太长而无法显示全部内容(有 15 个这样的视图,但您在这里只能看到 6 个):
所以...我ScrollView
在整个事情上添加了一个。之外,GeometryReader
因为否则所有观点都是错误的。这是代码:
var body: some View {
if (challengeViewModel.challengeAmount != 0) {
ScrollView {
GeometryReader { geometry in
let points = calculatePoints(geometry: geometry)
drawPaths(geometry: geometry, points: points)
.stroke(lineWidth: 3).foregroundColor(.yellow)
drawCircles(geometry: geometry, points: points)
}
}
.background(Color.black)
.navigationBarTitle("Journey")
} else {
Text("Loading...")
}
}
Run Code Online (Sandbox Code Playgroud)
(内容基本上就是1.根据屏幕尺寸计算点,2.沿着点绘制路径,3.在点上放置圆圈)
问题:
现在我明白需要从父级和子级GeometryReader
获取其高度,这成为一个“先有鸡还是先有蛋的问题”。ScrollView
所以我想手动计算高度GeometryReader
。
第一次尝试
最简单的方法是采用一些固定值并计算出一个非常粗略的值。我只是将其添加到GeometryReader
:
GeometryReader { geometry in …
Run Code Online (Sandbox Code Playgroud) 用非常基本的术语来说,在我的 Android 应用程序中,我有一个屏幕可以绘制圆圈,然后用曲线将它们连接起来。
我正在尝试在 SwiftUI 中重新创建它。
我发现这个问题看起来与我正在寻找的问题非常相似,但不幸的是答案非常简短,即使在阅读了大约 10 个不同的博客和 5 个视频之后,我仍然没有完全理解它。
我可以在 SwiftUI 中布局后获取“View”的位置吗?
所以基本逻辑是我以某种方式GeometryReader
用来获取我创建的每个元素的.midX
和.midY
坐标Circle
,然后Paths
在它们之间进行绘制。我唯一的问题是在创建圆之后获取这些坐标。
如何将路径添加到屏幕上,在ZStack
前面Circles
,路径作为一个自定义形状在后面?
更多信息:
在 Android 上,最终结果如下所示:
基本上我有一个Challenge
具有名称和一些详细文本的对象,我将它们像这样布局,以便它在视觉上代表用户的“旅程”。
所以我真正需要的是知道如何布置一些圆圈/图像(上面有文字),然后绘制连接它们的线。每个这样的挑战圈都需要可点击才能打开详细视图。
我尝试用2个循环设置2D布尔数组的值,如下所示:
boolean[][] frame = new boolean[10][4];
for (boolean[] column : frame)
for (boolean b : column)
b = true;
Run Code Online (Sandbox Code Playgroud)
但这似乎没有用,所有的布尔都是假的,为什么呢?
我有一个实现 Iterable 的类,但有自己的hasNext()
和这样的next()
方法:
public class BLMovie implements Iterable<BLMovieFrame> {
@Override
public Iterator<BLMovieFrame> iterator() {
iteratorVar = 0;
return liste.iterator();
}
public boolean hasNext() {
if (loop)
return true;
return iteratorVar < liste.size();
}
public BLMovieFrame next() {
iteratorVar = (iteratorVar++)%(liste.size()-1);
return liste.get(iteratorVar);
}
public void remove() {
throw new UnsupportedOperationException();
}
Run Code Online (Sandbox Code Playgroud)
我很确定这不是最好的方法,
关于 Iterable 的其他线程似乎并不关心自己的下一个方法,所以有人对我有建议吗?