我只需要有人告诉我,我是否正确理解何时使用<include>
以及何时使用<merge>
.
所以,我创建了一个标题布局,我希望将其包含在其他XML布局中:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Header text" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我以这种方式将它包含在其他XML中(这是非常基本的):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<include
android:id="@+id/header"
layout="@layout/top"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
这将很好,没有问题.但是为了优化代码,我必须<merge>
在包含的布局中使用.所以不top layout
应该有标签,<LinearLayout>
但它必须如下所示:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Header text" />
</merge>
Run Code Online (Sandbox Code Playgroud)
我理解正确吗?
自从最近发布Android 5.0 Lollipop以来,我在Nexus 4设备中遇到了蓝牙低功耗API的非常糟糕的性能.使用以前的操作系统版本(Android 4.4.4 Kit-Kat),它就像一个魅力,在5.0上运行的相同应用程序具有以下行为:
它经常不检测来自外围设备的任何广告包.
外围设备的ADVERTISING_INTERVAL是20ms,因此应用程序应该在最坏的情况下在60ms内检测到至少一个广告.我已尝试
BluetoothLeScanner
(使用SCAN_MODE_LOW_LATENCY设置)不使用已弃用mBluetoothAdapter.startLeScan(mLeScanCallback)
但未成功.
当它发生时,当我尝试连接到GATT服务器时,很少这样做.
我已经检查过BLE嗅探器,CONNECTION_REQUEST数据包甚至没有发送到外设.
似乎我不是唯一一个有这种错误的人,而其他一些用户也发布了类似的问题.有人知道发生了什么吗?
-
更新1: (2014/12/17)
我还使用运行Lollipop的Nexus 5测试了相同的应用程序,它很少连接到GATT服务器.每次我发送连接请求时,它都不会,因为外围设备没有收到数据包.在将此Nexus 5升级到Lollipop之前,它在Kit-Kat 4.4.4上完美运行.
更新2: (2014/12/17)
Android 5.0.1根本没有解决问题.
更新3: (2015/04/23)
Android 5.1也没有解决问题.今天我有机会在SAMSUNG Galaxy S4上测试Android 5.0.1,它运行得很好.我还在Nexus 5上测试了一个全新的Android 5.1安装,它也可以正常工作.问题仍然存在于Nexus 4.他们在Android 5.0和后续版本的固件上做了一些奇怪的事情,破坏了Android 4.4.4与蓝牙API的完美兼容性.
我遇到了Android 6.0和一些蓝牙低功耗设备的严重问题.其中一个冲突的设备就是这个:
DEVICE INFO:
Name: Samsung Galaxy SV
Model number: SM-G900V
Android vers: 6.0.1
Patch level: May 1, 2016
Hard. vers: G900V.05
Run Code Online (Sandbox Code Playgroud)
如果我根据连接和断开应用程序与BLE外围设备进行一些压力测试,则成功率几乎不会达到50%.
阅读Android的最新文档,他们建议在connectGatt方法的最后一个参数中指定传输模式,以强制执行BLE传输连接而不是BR/EDR:
device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE);
Run Code Online (Sandbox Code Playgroud)
这种改进没有任何改变.
根据一些建议并阅读有关BLE连接问题的内容,我发现三星Galaxy S6存在一些相关问题,其中一个问题是他们提出了一系列修复BLE连接问题的步骤.关键的一个是清除蓝牙共享系统应用数据.这样做,连接率几乎立即增加了100%.但是,如果您等待并使用其他一些BLE应用程序并连接到其他外围设备,问题迟早会回来.
Google Play中有一些应用尝试修复这些BLE问题,他们基本上做的是:
/system/bin/rm -r /data/misc/bluetoothd/*
/system/bin/rm -r /data/misc/hcid/*
Run Code Online (Sandbox Code Playgroud)
虽然这是一种清除蓝牙缓存的方法,但它需要设备根植,这对专业应用来说不是一个合理的解决方案.
我研究的私有Android API都没有帮助我解决这个问题,我发现的唯一类似的是强制执行与问题无关的服务发现缓存清理.
使用BLE数据包嗅探器我发现ADV_CONNECT_REQ
甚至没有从设备发送到外围设备,一段时间后Android堆栈触发STATE_DISCONNECTED
事件BluetoothGattCallback
.
我不知道为什么在某些6.0设备中出现此问题而在其他设备中没有,因为蓝牙共享缓存似乎是问题所在.那里到底存储了什么?刚刚连接/配对的设备?我是唯一一个遇到这个问题的人吗?如果没有,你们怎么解决它?我不想指导最终用户如何清除蓝牙共享应用数据.
android bluetooth bluetooth-lowenergy android-6.0-marshmallow
Google开发者支持非常明确:
Alpha/Beta可用性
Alpha和beta APK需要具有比生产APK更高的版本代码才能进行测试.
要为alpha测试人员提供服务,alpha APK需要拥有比beta APK更高的版本代码.
如果使用比alpha APK更高的版本代码上传测试版APK,则会自动停用Alpha版本.
- 如果使用比alpha或beta APK更高的版本代码上传制作APK,则会自动停用Alpha和/或Beta版本.
Alpha测试组用户有资格使用与其设备兼容的最高版本代码的应用的alpha版,测试版或生产版.Beta测试组用户只能使用与其设备兼容的最高版本代码的应用的测试版或生产版.
我的问题是,有没有办法区分具有相同二进制或APK的自定义参数的Alpha/Beta版本和生产版本?当我的意思是自定义参数时,它会像指向测试或生产云端点的URL.
问题是,否则我必须根据配置文件发布不同的APK,并且当我发布到生产alpha/beta测试人员时,将获得指向生产云端点的更新,其中数据在测试中.我将不得不发布一个生产版本,然后是另一个alpha/beta版本来解决这个问题,但我发现它非常无聊.
我有一些.aar
文件。我通过右键单击项目将它们添加到项目中,然后添加新模块,在那里我选择了Import .jar .aar Package
.
这.aar
在我的项目中添加了该文件,以及一个新创建的.gradle
文件。
新的 Gradle 文件
configurations.maybeCreate("default")
artifacts.add("default", file('SDKTest-rel-1.01.aar'))
Run Code Online (Sandbox Code Playgroud)
现在当我尝试在我的build.gradle
文件中添加这个文件时,它给了我错误消息
无法解决:SDKTest-rel-1.01。
我无法SDK
在我的程序中使用这个类。
请指导我并告诉我添加和使用.aar
文件的其他方法。
我想通过老式的ViewModel(而不是来自Google新的Architecture Components)中的Androids数据绑定功能来更改SearchView的查询参数。SearchView驻留在工具栏中。
在ViewModel
我要调用setQuery(String)
和onSubmit
查询我想用它来处理。在当前实现中(请参见下面的代码部分),SearchViews查询值保持为空。这很清楚,因为没有在BindingAdapter for附近使用字段查询SearchView.setQuery()
。但是我不知道如何从代码更改其查询值。setQuery(SearchView, String)
不能调用BindingAdapter ,因为中没有SearchView,因此ViewModel
不应为MVVM架构保持其清洁。
绑定SearchView的其他直接可用属性,例如:QueryHint和queryTextListener可以正常工作。尽管查询属性SearchView
具有设置器(SearchView.setQuery(String)
),但不能直接在中使用。
我能做什么?
XML部分和相应的MainViewModel看起来像这样:
<data>
<variable
name="vm"
type="com.example.MainViewModel"/>
</data>
<android.support.v7.widget.Toolbar
android:id="@+id/activity_toolbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:layout_marginTop="0dp"
android:background="@color/colorPrimary"
android:title="@string/app_name"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:subtitleTextColor="@color/white"
app:title="@string/app_name"
app:titleTextColor="@color/white" >
<android.support.v7.widget.SearchView
android:id="@+id/searchView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:iconifiedByDefault="false"
android:queryHint="@{vm.queryHint}"
app:iconifiedByDefault="false"
app:queryTextListener="@{vm.onQueryTextListener}"
app:query="@{vm.query}" />
</android.support.v7.widget.Toolbar>
Run Code Online (Sandbox Code Playgroud)
ViewModel:
public class MainViewModel extends BaseObservable {
private doSomething() {
setQueryHint("TheHintText")
setQuery("MyQuery");
}
private void setQueryHint(String queryHint) {
this.queryHint = queryHint;
notifyPropertyChanged(BR._all); …
Run Code Online (Sandbox Code Playgroud) 我们在公司成功使用MSBuild几年.我们为每个Build规范(Release,Debug等)都有一个非常自定义的.proj构建文件,其中包括许多操作:
由于微软包含在TFS2010一个新的功能,使构建使用Windows Workflow Foundation的,我们正在考虑改变它.正如Jim Lab(Team Foundation Server的项目经理)在一篇文章中所说,这是他应该何时使用它们的一般指导:
- 如果任务需要了解特定构建输入或输出,请使用MSBuild
- 如果在Visual Studio中构建时需要执行任务,请使用MSBuild
- 如果您只需要在构建服务器上构建任务时使用该任务,请使用WF,除非它需要了解特定的构建输入/输出
我仍然不太确定它,我想知道你自己的经验,积极的事情,缺点等.如果你修改了DefaultTemplate.xaml来执行你自己的操作,你的意见会更有价值.
使用Android Support Library
v7小部件CardView
我看到Galaxy S4与Nexus 4设备相比有不同的结果.具有以下布局:
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_width="fill_parent"
android:layout_height="150dp"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:layout_marginBottom="10dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:orientation="horizontal"
card_view:cardCornerRadius="7dp"
card_view:cardElevation="12dp">
<ScrollView
android:id="@+id/scrollView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true">
<TextView
android:id="@+id/txtExample"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_messages" />
</ScrollView>
</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)
我得到了这些结果:
Nexus 4(5.0.1):
三星Galaxy S4(4.4.2):
似乎Nexus上的那个用它的边缘计算视图,然后在外面绘制阴影.另一方面,三星之一似乎应用了边距,然后在内部绘制阴影,直到达到计算出的View界限.
我错过了什么吗?
android android-layout android-support-library android-cardview
我知道iOS 9 中有特定的新方法支持特定情况或用例的Apple Pay抑制。我有一个需要使用以下方法进行应用的人员之一:
+ (PKSuppressionRequestToken)requestAutomaticPassPresentationSuppressionWithResponseHandler:(void (^ _Nonnull)(PKAutomaticPassPresentationSuppressionResult result))responseHandler
Run Code Online (Sandbox Code Playgroud)
但是,每次调用此方法时,都会得到以下响应: PKAutomaticPassPresentationSuppressionResultDenied (Either the user prevented the suppression, or an internal error occurred)
在文档标记中作为重要提示,请注意:
重要说明此方法需要Apple发行的特殊权利。如果没有权利,则请求将失败,并显示PKAutomaticPassPresentationSuppressionResultNotSupported结果。有关更多信息,请访问developer.apple.com/apple-pay/。
为了得到PKAutomaticPassPresentationSuppressionResultSuccess
结果我们应该怎么做?我们在“ Apple ID”中启用了Apple Pay,甚至创建了Merchand ID,然后再次下载了Development Provisioning Profile,其中包括所有这些并包含在项目中。在那里,我们也启用了“ Apple Pay”功能,但是仍然PKAutomaticPassPresentationSuppressionResultDenied
出现错误。
测试环境信息:
谢谢大家
我想创建 dagger 2 自定义范围@User
来管理用户登录状态。它应该比应用程序少,比活动多。之前图书馆已经介绍过AndroidInjection.inject()
它不是很复杂的东西。您在用户登录时(从应用程序范围的组件)管理组件并为此范围创建新组件,并在用户注销时销毁它。你可以在活动中有这样的事情onCreate()
LoginManager.getInstance()
.getUserComponent()
.newActivityComponentBuilder()
.activity(this)
.build()
.inject(this);
Run Code Online (Sandbox Code Playgroud)
但是现在所有代码都生成了,我们只有应用程序、活动和片段范围。而且我无法理解如何使用AndroidInjection.inject()
保存此组件的位置以及如何将其置于应用程序和活动范围的中间来管理我的自定义范围。
感谢您提供任何有用的教程、文档或示例。