我正在为几个窗口共享的一系列控件创建一个UserControl.其中一个控件是Label,它根据"协议编号"显示其他一些过程的流程.
我正在尝试使用此Label提供DataBinding,因此Window会在协议编号变量更改时自动反映进程的状态.
这是用户控件XAML:
<UserControl Name="MainOptionsPanel"
x:Class="ExperienceMainControls.MainControls"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
>
<Label Height="Auto" Name="numberLabel">Protocol:</Label>
<Label Content="{Binding Path=ProtocolNumber}" Name="protocolNumberLabel"/>
(...)
</UserControl>
Run Code Online (Sandbox Code Playgroud)
这就是Code-Behind:
public partial class MainControls
{
public MainControls()
{
InitializeComponent();
}
public int ProtocolNumber
{
get { return (int)GetValue(ProtocolNumberProperty); }
set { SetValue(ProtocolNumberProperty, value); }
}
public static DependencyProperty ProtocolNumberProperty =
DependencyProperty.Register("ProtocolNumber", typeof(int), typeof(MainControls));
}
Run Code Online (Sandbox Code Playgroud)
这似乎是有效的,因为如果在构造函数中我将ProtocolNumber设置为任意值,它将反映在用户控件中.
但是,在最终窗口上使用此用户控件时,数据绑定会中断.
XAML:
<Window x:Class="UserControlTesting.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:expControl="clr-namespace:ExperienceMainControls;assembly=ExperienceMainControls"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
>
<StackPanel>
<expControl:MainControls ProtocolNumber="{Binding Path=Number, Mode=TwoWay}" />
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
窗口的代码隐藏:
public partial class …Run Code Online (Sandbox Code Playgroud) 我正在使用awesome select2创建一个多选组合.
我想以编程方式选择默认值(如用户先前所做的选择),但我不知道如何.我读到使用initSelection可以解决这个问题,但是在创建组合时会调用它,我不希望始终完成此默认选择.
我有一个使用Kickflip和ButterflyTV libRTMP传输视频的应用程序
现在有99%的时间应用程序正常工作,但我不时会遇到一个我无法调试的本机分段错误,因为消息太含糊了:
01-24 10:52:25.576 199-199/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-24 10:52:25.576 199-199/? A/DEBUG: Build fingerprint: 'google/hammerhead/hammerhead:6.0.1/M4B30Z/3437181:user/release-keys'
01-24 10:52:25.576 199-199/? A/DEBUG: Revision: '11'
01-24 10:52:25.576 199-199/? A/DEBUG: ABI: 'arm'
01-24 10:52:25.576 199-199/? A/DEBUG: pid: 14302, tid: 14382, name: MuxerThread >>> tv.myapp.broadcast.dev <<<
01-24 10:52:25.576 199-199/? A/DEBUG: signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x9fef1000
01-24 10:52:25.636 199-199/? A/DEBUG: Abort message: 'Setting to …Run Code Online (Sandbox Code Playgroud) 我开发了一个包含Webview的应用程序.我想让我的应用程序完全可访问,因此对于webview元素,我希望TalkBack以完全可访问的方式读取诸如"标题","横幅","EditText"等html元素.
我已经看到WebView中的TTS过程是通过Chromium AccessibilityInjector.java类通过JS注入完成的.这会将此脚本注入到页面中,该页面仅包含英文消息.结果是当设备使用另一种语言时,TTS会用英语读取这些html元素.
现在我无法调试或扩展chrome webclient,那么如何根据用户的语言环境使TTS读取我的页面?
编辑:顺便说一句,我正在使用jQuery Mobile.
我有一个带有几个按钮的用户控件,根据使用它的类需要采取不同的操作.
问题是我不知道如何实现这些处理程序,因为当从最终应用程序使用我的用户控件时,我没有直接访问按钮来指定哪个处理程序处理哪些事件.
你会怎么做?
我有一个主要在Kotlin中编写的项目,但是有一些java类.项目现在已经很先进了,我想增加在不同环境之间切换的可能性,我使用了这些环境:
productFlavors {
prod {
dimension "default"
buildConfigField 'boolean', 'FABRIC', 'true'
applicationId = "com.myapp"
}
beta {
dimension "default"
buildConfigField 'boolean', 'FABRIC', 'true'
applicationId = "com.myapp.beta"
}
dev {
dimension "default"
buildConfigField 'boolean', 'FABRIC', 'false'
applicationId = "com.myapp.dev"
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行非生产的风格(不改变applicationId)时,我得到一个java类的ClassDefNotFoundException:
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.myapp.beta.ui.view.ScrollBehavior" on path: DexPathList[[zip file "/data/app/com.myapp.beta-1/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp.beta-1/lib/arm64, /system/lib64, /vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 33 more
Run Code Online (Sandbox Code Playgroud)
我正在使用Android Studio 3.0 beta 4和Kotlin插件版本1.1.3-2.
构建文件:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply …Run Code Online (Sandbox Code Playgroud) 我有一个Android应用程序刚刚超过方法限制,所以我尝试启用multidex.一旦我这样做,我得到以下错误:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithMultidexlistForProdDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.RuntimeException: java.io.IOException: Can't write [/Users/user/dev/myapp/app/build/intermediates/multi-dex/prod/debug/componentClasses.jar] (Can't read [/Users/user/dev/myapp/app/build/intermediates/transforms/desugar/prod/debug/65.jar(;;;;;;**.class)] (Duplicate zip entry [65.jar:android/support/multidex/MultiDex.class]))
at com.android.builder.profile.Recorder$Block.handleException(Recorder.java:55)
at …Run Code Online (Sandbox Code Playgroud) 我有一个内部布局和SurfaceTexture视频流的对话框.当我收到视频width和height视频时,我会调整我的布局:
private void resizeView(final VideoFormatInfo info) {
final Size size = calculateSize(info.getWidth(), info.getHeight());
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
final ViewGroup.LayoutParams layoutParams = mInnerLayout.getLayoutParams();
layoutParams.width = size.x;
layoutParams.height = size.y;
Log.i(TAG, String.format("run: setting innerlayout bounds to %d,%d", size.x, size.y));
mInnerLayout.setLayoutParams(layoutParams);
}
});
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个全屏按钮,应该将布局调整到整个屏幕.但是当我按下它时,布局仍然在屏幕的一个小区域内.
当我检查日志中正确的值size.x和size.y是否(屏幕的边界),但布局没有正确调整大小.
innerlayout被添加到名为"VideoPlayer"的customView中.我将视频播放器背景的颜色设置为红色,因此当我切换到全屏时,整个屏幕变为红色,除了中间的视频流.这意味着底层视图正在适当调整大小,但innerLayout不是出于某种原因.
有趣的是,我在视频渲染上有另一种布局,可以创建"闪光效果"来模拟拍摄快照时的相机闪光.触发该闪光效果后,视频将调整为整个屏幕.
所以这是我的布局树:
VideoPlayerView (CustomView, not VideoView)
innerLayout (RelativeLayout)
videoSurfaceTexture (SurfaceTextureView)
flashLayout (RelativeLayout)
Run Code Online (Sandbox Code Playgroud)
我也将其设置为调试:
@Override
public void onSurfaceTextureSizeChanged(final SurfaceTexture surfaceTexture, final int width, …Run Code Online (Sandbox Code Playgroud) 在Espresso中是否可以对具有特定ID的元素进行计数?
我可以,onView(withId(R.id.my_id))但后来我被困住了。
我有一个LinearLayout,可以在其中注入元素(而不是ListView),并且我想测试有多少个元素以检查它们是否符合预期的行为。
我在网上搜索但是关于这个的信息非常少.
我有一个实时广播应用程序,我通过RTMP堆栈使用Android MediaCodec SDK发送由摄像头和麦克风产生的编码H264视频帧和AAC音频块.
我的直播流是720p,我的目标是2500Kbps的高质量.这显然需要非常好的网络连接,如果您使用数据计划,这意味着4G.
问题是即使连接最大,也会出现低峰值和拥塞,因此网络将无法保持如此沉重的流量.因为我想提供高可靠性,我想在我的应用程序中包含自动自适应比特率,以便降低图像质量或有利于可靠性.
问题是 - 如何实现这种自动适应网络条件而不丢失帧?它甚至可能吗?我使用像Cerevo这样的专业编码设备,他们不会丢帧 - 但是对于我的应用程序,由于p帧在网络中丢失,我总是会受到一些可怕的拖累.
这就是我目前拥有的:
private long adaptBitrate(long idleNanos, Frame frame) {
int bytes = frame.getSize();
long nowNanos = System.nanoTime();
if (nowNanos - mLastNanos > 1000L * 1000 * 1000) {
double idle = (double) idleNanos / (double) (nowNanos - mLastNanos);
float actualBitrate = newBitrate;
int size = mBuffer.size();
String s = "Bitrate: " + actualBitrate / 1000
+ " kbps In-Flight:" + bytes
+ " idle: " + idle;
if …Run Code Online (Sandbox Code Playgroud)