在适用于Android的新Google Maps API中,我们可以添加标记,但无法(轻松)删除标记.
我的解决方案是将标记保留在地图中并在我想删除标记时重绘地图,但效率不高.
private final Map<String, MarkerOptions> mMarkers = new ConcurrentHashMap<String, MarkerOptions>();
private void add(String name, LatLng ll) {
final MarkerOptions marker = new MarkerOptions().position(ll).title(name);
mMarkers.put(name, marker);
runOnUiThread(new Runnable() {
@Override
public void run() {
mMap.addMarker(marker);
}
});
}
private void remove(String name) {
mMarkers.remove(name);
runOnUiThread(new Runnable() {
@Override
public void run() {
mMap.clear();
for (MarkerOptions item : mMarkers.values()) {
mMap.addMarker(item);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
有没有人有更好的主意?
我正在使用Android Jetpack 的新导航组件.
根Activity设置非常简单:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
val navController = findNavController(R.id.navigationFragment)
setupActionBarWithNavController(navController)
bottomNavigationView.setupWithNavController(navController)
}
Run Code Online (Sandbox Code Playgroud)
当导航图中定义了Fragment的标题时,它很有效.但对于一个片段,我想动态设置标题.
我尝试过,findNavController().currentDestination.label = "Hello world"但它没有做任何事情.
我当然可以使用类似的技巧(activity as? AppCompatActivity)?.supportActionBar?.title = "Hello world",但我觉得它会打破对我有用的魔力setupActionBarWithNavController().有没有办法动态更新动作栏标题?
我希望每当更新行时使用当前时间戳更新字段.
在MySQL中,我会在声明表时这样做
LastUpdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)
但是"on update"部分不适用于SQLite.我找不到自动执行的方法,是否需要声明触发器?
编辑:为了记录,这是我当前的触发器:
CREATE TRIGGER [UpdateLastTime]
AFTER UPDATE
ON Package
FOR EACH ROW
BEGIN
UPDATE Package SET LastUpdate = CURRENT_TIMESTAMP WHERE ActionId = old.ActionId;
END
Run Code Online (Sandbox Code Playgroud)
谢谢
我有3个屏幕的工作流程.从"屏幕1"到访问"屏幕2",用户必须接受我在图片"模态"中调用的某些条款和条件.但他只需要接受这些条件一次.下次他在第一个屏幕上时,他可以直接进入屏幕2.用户可以选择不接受这些条款,因此我们返回"屏幕1"并且不要尝试转到"屏幕2".
我想知道如何使用新的导航组件.
以前,我会做什么:
startActivityForResult()并等待模态的结果.将条款标记为已接受.开始"屏幕2"但是使用导航图,无法启动片段来获取结果.
我可以在"模态"屏幕上标记接受的条款,然后从那里开始"屏幕2".问题是,要访问屏幕2,我需要做一个网络请求.我不想复制对API的调用并在"屏幕1"和"模态"中处理其结果.
有没有办法从"模态"回到"屏幕1"与一些信息(用户接受条款),使用Jetpack导航?
编辑:我目前通过使用Yahya建议的相同流程绕过它:使用一个仅用于模态的活动并使用startActivityForResult"屏幕1".我只是想知道我是否可以继续使用导航图来表示整个流程.
我想显示一个滑块,该滑块可以由用户使用拖放进行更新,也可以从服务器实时更新。
当用户完成拖动手势时,我想将最终值发送到服务器。
我最初的尝试是:
@Composable
fun LightView(
channel: UiChannel,
onDimmerChanged: (Float) -> Unit
) {
val sliderValue = channel....
Slider(value = sliderValue, onValueChange = onDimmerChanged)
}
Run Code Online (Sandbox Code Playgroud)
该onDimmerChanged方法来自我的 ViewModel,它更新服务器值。它工作得很好,但是onValueChange每次移动都会被调用,这会用不需要的请求轰炸服务器。
我尝试创建一个自定义滑块:
@Composable
fun LightView(
channel: UiChannel,
onDimmerChanged: (Float) -> Unit
) {
val sliderValue = channel....
Slider(initialValue = sliderValue, valueSetter = onDimmerChanged)
}
@Composable
fun Slider(initialValue: Float, valueSetter: (Float) -> Unit) {
var value by remember { mutableStateOf(initialValue) }
Slider(
value = value,
onValueChange = { value = it …Run Code Online (Sandbox Code Playgroud) 根据我的阅读和听说,Android兼容包碎片具有与"常规"Honeycomb碎片相同的功能.
谷歌显然计划在一段时间内维护兼容性软件包.
是什么原因让我选择"常规"而不是ACP?
我能找到的唯一原因是尺寸.ACP罐子是220ko,但在我看来并不是那么多.
那是一个速度问题吗?还有什么别的我想不到的?
我试图找到一种方法在应用程序中插入插件.
我的目标是拥有一个Core应用程序,并提供可在市场上下载的插件.(它可以是任何东西,天气,广播播放器等......)
插件不会相互交互,因此核心应用程序更像是多个应用程序的目录,其中包含插件使用的SDK.
Android文档中有Tic Tac Toe示例,但需要主应用程序声明外部lib.我的愿望是核心应用程序检测到新安装的插件并显示它们.
我发现了另一个问题,但没有答案.
有没有办法做到这一点?
编辑:还有一些应用程序可以通过购买市场上的另一个应用程序来解锁.他们是如何工作的?我找不到任何有趣的东西.谷歌"android解锁":)你知道你发现了什么
我正在做一个Android服务,为其他可以注册为回调的应用程序提供内容.
我不是100%确定Android Handler类是如何工作的,所以有人可以确认我这个代码是线程安全的吗?
public class MyService extends Service {
private static final String MESSAGE = "message";
private final RemoteCallbackList<IMyCallback> readerCallbacks = new RemoteCallbackList<IMyCallback>();
private static final int REPORT_MSG = 1;
private Thread readerThread;
@Override
public void onCreate() {
readerThread = new Thread(readerRunnable);
readerThread.setDaemon(true);
readerThread.start();
}
private Runnable readerRunnable = new Runnable() {
@Override
public void run() {
while (!Thread.interrupted()) {
// Blocking call
byte[] message = JniCommunicator.readMessage();
if (message == null || message.length == 0) {
continue;
}
Bundle b …Run Code Online (Sandbox Code Playgroud) 编辑:我解决了我的问题,但我有兴趣了解为什么我的修复工作.见下文.
我使用autolayout来构建我UITableViewCell的.
单元格非常简单,有2个标签(紫色和黄色)和文本字段(绿色).

这在第一次显示时工作正常.但是当我推动一个新的视图控制器时,视图会立即重新排列.无论出于何种原因,紫色标签都会变大.
这是一个示例,我单击"父帐户ID"单元格以推送新的视图控制器.请注意,一旦转换开始,布局就会发生变化.当我回来时它仍然改变了.

这些项目是在[UILabel new]没有框架的情况下创建的.
[self.contentView addSubview:self.textLabel];
[self.contentView addSubview:self.errorLabel];
[self.contentView addSubview:self.textField];
Run Code Online (Sandbox Code Playgroud)
然后使用Masonry创建自动布局.
UIEdgeInsets insets = UIEdgeInsetsMake(3, 15, 3, 15);
[self.textLabel makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self.contentView).insets(insets);
make.width.priorityLow();
}];
[self.errorLabel makeConstraints:^(MASConstraintMaker *make) {
make.top.right.equalTo(self.contentView).insets(insets);
make.left.equalTo(self.textLabel.right).offset(5);
}];
[self.textField makeConstraints:^(MASConstraintMaker *make) {
make.left.bottom.right.equalTo(self.contentView).insets(insets);
make.top.equalTo(self.textLabel.bottom).insets(insets);
}];
Run Code Online (Sandbox Code Playgroud)
请注意,我从未指定高度,因为我并不关心高度.(只要它是一致的!)
知道为什么这会改变吗?谢谢
我现在还设置了autolayout属性contentView.
[self.contentView makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
Run Code Online (Sandbox Code Playgroud)
我仍然有兴趣了解为什么contentView改变它的大小!
我想有一个接口与3个组件紧挨着另一个.第一个是ListView,另外两个是Grids.
由于组件将在右侧溢出,我想将它们放在ScrollViewer中.我没有成功.我试着做一个非常简单的例子来试试,但即便是这个例子也失败了.
<ScrollViewer Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" VerticalAlignment="Top" Width="600" Height="400">
<StackPanel Width="1200" Height="400" Orientation="Horizontal">
<Border Background="AntiqueWhite" Width="400" Height="400" HorizontalAlignment="Left" VerticalAlignment="Top" />
<Border Background="Blue" Width="400" Height="400" HorizontalAlignment="Left" VerticalAlignment="Top" />
<Border Background="LimeGreen" Width="400" Height="400" HorizontalAlignment="Left" VerticalAlignment="Top" />
</StackPanel>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
如您所见,ScrollViewer位于网格内部.我错过了什么?
android ×7
android-architecture-navigation ×2
autolayout ×1
c# ×1
google-maps ×1
handler ×1
ios ×1
kotlin ×1
plugins ×1
sqlite ×1
triggers ×1
uitableview ×1
windows-8 ×1
xaml ×1