让我们假设我们正在开发基于LinearLayout的复合组件.所以,我们创建这样的类:
public class SomeView extends LinearLayout {
public SomeView(Context context, AttributeSet attrs) {
super(context, attrs);
setOrientation(LinearLayout.VERTICAL);
View.inflate(context, R.layout.somelayout, this);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们将使用它LinearLayout作为根somelayout.xml,我们将有额外的视图级别,所以我们使用merge标记:
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Some text"
android:textSize="20sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Some other text"/>
</merge>
Run Code Online (Sandbox Code Playgroud)
但是在IDE中的预览选项卡中,合并始终充当FrameLayout,我们会看到类似的东西:

(这是Android Studio,Intellij IDEA也一样,关于Eclipse我不知道)
预览加快了布局的开发速度,即使对于某些布局,它也会失去如此大的帮助.可能有一种方法可以指定,预览应该如何解释merge特定布局中的标签?
android intellij-idea android-layout android-studio android-tools-namespace
我需要添加添加具有复杂项目背景的ListView:顶部和底部的偶数/奇数和圆角不同.它看起来像这样:

我已经通过level-list实现了所有这些东西,但还有一件事我想做.现在底部项目靠近屏幕的底部.最好添加一些空间.

我不想为ListView添加底部边距,我只需要最后一项的保证金.
我看到这样做的方式:
一种破解 - 将带有空TextView的页脚添加到ListView.但是页脚是非常不稳定的东西,它们通常会在notifyDataSetChanged之后消失,并且无法让它们恢复
我让设计师向底部背景资源添加透明像素.不幸的是,在这种情况下,垂直居中完全被打破.例如,有9patch像这样:

和这样的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!-- View with background with transparent pixels on bottom -->
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"
android:id="@+id/item"
android:background="@drawable/some_bgr"
android:padding="10dp"
>
<TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"
android:text="Title"
android:layout_gravity="center"
android:textSize="18sp"
/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Detail"
android:layout_gravity="center"
android:textSize="18sp"
/>
</LinearLayout>
<!-- Just for marking place took by view -->
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"
android:layout_below="@id/item"
android:background="#88ff55"
/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
结果:

如您所见,居中不起作用.不幸.(顺便说一句,如果将此9patch指定为TextView的背景,则居中工作效果很好.如果你知道任何文章,请解释一下,请告诉我.)
这应该工作,但由于未知的原因,我仍然无法使它工作.我不喜欢这种方式,因为我不喜欢修改代码中的维度.
已经存在想象的方式 - 使用特定的位图和边距构造一些XML drawable.根据drawables概念应该是可能的,但我找不到实现.可能有人知道吗?
还有其他想法吗?
我试图从代码中获取应用程序的debuggable属性值:
packageInfo = context.getPackageManager().getPackageInfo(packageName, 0);
int flags = packageInfo.applicationInfo.flags;
isDebugMode = (flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
Run Code Online (Sandbox Code Playgroud)
我注意到,当清单中未指定debuggable属性时,此代码将其定义为true.文档说它默认是假的.
怎么了?
现在我使用随机数作为请求代码.因此,每次我为startActivityForResult添加新活动时,我都需要检查所有其他此类活动以避免冲突.可能有任何定义值的做法,不可设计的可碰撞?你怎么看?
例如,我有要序列化的类
[Serializable]
class Person
{
[XmlAttribute("name")]
string Name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我需要使Name属性成为必需.如何在.NET中执行此操作?
我需要使用FFmpeg库将几个jpg文件加入到视频中.但是我在阅读这些文件时遇到了问题.这是一个读取图像文件并生成AVFrame的函数:
AVFrame* OpenImage(const char* imageFileName)
{
AVFormatContext *pFormatCtx;
if(av_open_input_file(&pFormatCtx, imageFileName, NULL, 0, NULL)!=0)
{
printf("Can't open image file '%s'\n", imageFileName);
return NULL;
}
dump_format(pFormatCtx, 0, imageFileName, false);
AVCodecContext *pCodecCtx;
pCodecCtx = pFormatCtx->streams[0]->codec;
pCodecCtx->width = W_VIDEO;
pCodecCtx->height = H_VIDEO;
pCodecCtx->pix_fmt = PIX_FMT_YUV420P;
// Find the decoder for the video stream
AVCodec *pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
if (!pCodec)
{
printf("Codec not found\n");
return NULL;
}
// Open codec
if(avcodec_open(pCodecCtx, pCodec)<0)
{
printf("Could not open codec\n");
return NULL;
}
//
AVFrame *pFrame;
pFrame = …Run Code Online (Sandbox Code Playgroud) 我正在编写一个从远程服务器播放音频的应用程序.我尝试了几种方法来实现流式音频,但它们对我来说都不够好.这就是我尝试过的:
就像是:
MediaPlayer player = new MediaPlayer();
player.setDataSource(context, Uri.parse("http://whatever.com/track.mp3"));
player.prepare();
player.start();
Run Code Online (Sandbox Code Playgroud)
(或者prepareAsync,不管)
但是MediaPlayer播放远程内容时标准非常不稳定.它经常跌落或停止播放,我无法处理.另一方面,我想实现媒体缓存.但是我没有找到任何方法从MediaPlayer获取缓冲内容以将其保存在设备上的某个位置.
然后有一个想法是按块下载媒体文件,将它们组合成一个本地文件并播放该文件.由于连接不良,下载整个文件可能会很慢,因此可以下载足够的初始文件,然后开始播放并继续下载和附加本地文件.此外,我们还获得了缓存功能.
听起来像一个计划,但它并不总是有效.它完美地适用于HTC Sensation XE,但在完成这个初始作品后没有停止4.1平板电脑播放.不知道,为什么会这样.我问过这个问题,但没有得到答案.
我创建了两个MediaPlayer实例并试图让它们互相改变.逻辑如下:
来源:
private static final String FILE_NAME="local.mp3";
private static final String URL = ...;
private static final long FILE_SIZE = 7084032;
private static final long PREPARE_NEXT_PLAYER_OFFSET = 1000;
private static final int START_NEXT_OFFSET = 261;
private static final int INIT_PERCENTAGE = 3;
private MediaPlayer mPlayer;
private MediaPlayer mSecondaryPlayer; …Run Code Online (Sandbox Code Playgroud) 我需要创建控件来围绕其子项绘制边框.所以,我创建了类并从Decorator派生出来:
class RoundedBoxDecorator : Decorator
{
protected override Size ArrangeOverride(Size arrangeSize)
{
//some source
}
protected override void OnRender(DrawingContext dc)
{
//some source
}
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我对使用Decorator作为祖先有一些疑问.我在MSDN中发现它中没有特殊的方法或属性,只是从它的祖先(UIElement或FrameworkElement)派生而来.ArrangeOverride和OnRender也是派生的.
那么,Decorator类的设计是什么,使用它有意义吗?或者我可以从FrameworkElement派生出来?
在WinForms中,我们可以为按钮指定DialogResult.在WPF中,我们只能在XAML中声明取消按钮:
<Button Content="Cancel" IsCancel="True" />
Run Code Online (Sandbox Code Playgroud)
对于其他人,我们需要捕获ButtonClick并编写如下代码:
private void Button_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用MVVM,所以我只有Windows的XAML代码.但对于模态窗口我需要编写这样的代码,我不喜欢这样.在WPF中有更优雅的方式来做这些事情吗?
var_export当参数具有循环引用时,函数会导致异常。是否有任何替代方案(除了serialize)可以正确处理它?