小编Jon*_*nas的帖子

从GoogleMap中删除标记

在适用于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 google-maps

109
推荐指数
5
解决办法
9万
查看次数

使用AndroidX Navigation从Fragment动态ActionBar标题

我正在使用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().有没有办法动态更新动作栏标题?

android android-jetpack android-architecture-navigation

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

在使用SQLite更新current_timestamp

我希望每当更新行时使用当前时间戳更新字段.

在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)

谢谢

sqlite triggers

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

与Android架构导航相当的startActivityForResult()

我有3个屏幕的工作流程.从"屏幕1"到访问"屏幕2",用户必须接受我在图片"模态"中调用的某些条款和条件.但他只需要接受这些条件一次.下次他在第一个屏幕上时,他可以直接进入屏幕2.用户可以选择不接受这些条款,因此我们返回"屏幕1"并且不要尝试转到"屏幕2".

App工作流程

我想知道如何使用新的导航组件.

以前,我会做什么:

  • 在屏幕1上,检查用户是否必须接受条件
  • 如果不是,请启动"屏幕2"活动
  • 如果是,请使用startActivityForResult()并等待模态的结果.将条款标记为已接受.开始"屏幕2"

但是使用导航图,无法启动片段来获取结果.

我可以在"模态"屏幕上标记接受的条款,然后从那里开始"屏幕2".问题是,要访问屏幕2,我需要做一个网络请求.我不想复制对API的调用并在"屏幕1"和"模态"中处理其结果.

有没有办法从"模态"回到"屏幕1"与一些信息(用户接受条款),使用Jetpack导航?

编辑:我目前通过使用Yahya建议的相同流程绕过它:使用一个仅用于模态的活动并使用startActivityForResult"屏幕1".我只是想知道我是否可以继续使用导航图来表示整个流程.

android android-architecture-navigation

23
推荐指数
4
解决办法
4946
查看次数

Jetpack Compose:对滑块更改值做出反应

我想显示一个滑块,该滑块可以由用户使用拖放进行更新,也可以从服务器实时更新。

当用户完成拖动手势时,我想将最终值发送到服务器。

我最初的尝试是:

@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 kotlin android-jetpack-compose

10
推荐指数
2
解决办法
6955
查看次数

为什么在使用Android兼容包时使用"常规"片段?

根据我的阅读和听说,Android兼容包碎片具有与"常规"Honeycomb碎片相同的功能.

  • 一方面,你有Fragments可以使用1.6到4.0的设备.
  • 另一方面,您有片段只适用于3.1到4.0的设备.

谷歌显然计划在一段时间内维护兼容性软件包.

是什么原因让我选择"常规"而不是ACP?

我能找到的唯一原因是尺寸.ACP罐子是220ko,但在我看来并不是那么多.

那是一个速度问题吗?还有什么别的我想不到的?

compatibility android android-fragments

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

编写可以使用插件的应用程序

我试图找到一种方法在应用程序中插入插件.

我的目标是拥有一个Core应用程序,并提供可在市场上下载的插件.(它可以是任何东西,天气,广播播放器等......)

插件不会相互交互,因此核心应用程序更像是多个应用程序的目录,其中包含插件使用的SDK.

Android文档中有Tic Tac Toe示例,但需要主应用程序声明外部lib.我的愿望是核心应用程序检测到新安装的插件并显示它们.

我发现了另一个问题,但没有答案.

有没有办法做到这一点?

编辑:还有一些应用程序可以通过购买市场上的另一个应用程序来解锁.他们是如何工作的?我找不到任何有趣的东西.谷歌"android解锁":)你知道你发现了什么

plugins android

7
推荐指数
2
解决办法
1052
查看次数

确保我的代码是线程安全的

我正在做一个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)

android handler android-service

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

当我按下新的视图控制器时,Autolayout高度会发生变化

编辑:我解决了我的问题,但我有兴趣了解为什么我的修复工作.见下文.

我使用autolayout来构建我UITableViewCell的.

单元格非常简单,有2个标签(紫色和黄色)和文本字段(绿色).

我的手机

这在第一次显示时工作正常.但是当我推动一个新的视图控制器时,视图会立即重新排列.无论出于何种原因,紫色标签都会变大.

这是一个示例,我单击"父帐户ID"单元格以推送新的视图控制器.请注意,一旦转换开始,布局就会发生变化.当我回来时它仍然改变了.

细胞动画gif

这些项目是在[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改变它的大小!

uitableview ios autolayout

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

ScrollViewer不会滚动

我想有一个接口与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位于网格内部.我错过了什么?

c# xaml microsoft-metro windows-8 windows-runtime

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