Kotlin委托了属性,这是一个非常好的功能.但有时get()和set()方法是不够的.假设我想Closeable懒惰地创建一个对象并稍后关闭它.以下是如何实现此类委托属性的示例:
fun <T : Closeable> closeableLazy(initializer: () -> T) =
CloseableLazyVal(initializer)
class CloseableLazyVal<T : Closeable>(
private val initializer: () -> T
) : ReadOnlyProperty<Any?, T> {
private var value: T? = null
override fun get(thisRef: Any?, desc: PropertyMetadata): T {
if (value == null) {
value = initializer()
}
return value
}
fun close() {
value?.close()
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我想用它的方式:
private val stream by closeableLazy { FileOutputStream("/path/to/file") }
fun writeBytes(bytes: ByteArray) {
stream.write(bytes)
}
override …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序SyncAdapter.除了正常的同步之外,我还会触发一个USER_READ事件,我只需将它传递Bundle给适配器而不保留它:
Bundle settingsBundle = new Bundle();
settingsBundle.putString(SyncAdapter.USER_READ, uid);
ContentResolver.requestSync(account, authority, settingsBundle);
Run Code Online (Sandbox Code Playgroud)
这将在将来的某个时候正确调用我的同步例程.每个uid组中的Bundle将触发其自己的运行,一切都被预期同步.
如果现在连接不好,或者请求超时,那么我设置了一个软错误:
syncResult.stats.numIoExceptions += 1;
Run Code Online (Sandbox Code Playgroud)
这将导致请求稍后重复.这也很好用.
这些SyncRequests/Bundles持续多长时间?
该文件指出,该遇到软错误将导致exponentional补偿和同步将在以后运行一段时间.
鉴于连接错误并且同步因软错误而多次失败:我想知道是否只是将同步请求排入队列,或者我是否必须自己提供某种持久性以确保在某些时候发送请求.
我的AlertDialog应用程序中有一个.它包含一个包含TextView小部件的自定义视图列表.在Android 2.x上一切正常.在AlertDialog与白名单和它的黑白文本创建.但是当我在Android 3.x设备上运行我的应用时,所有TextView的都是黑色的,列表的背景也是黑色的.所以在我点击并按住其中一个项目之前,我看不到文字.
这是TextView布局文件中的定义:
<TextView
android:id="@+id/label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:textAppearance="?android:attr/textAppearanceSmallInverse" />
Run Code Online (Sandbox Code Playgroud)
我认为,使用textAppearanceSmallInverse的textAppearance属性设置文本参数的正确方法,它必须在所有设备上工作,但看来我错了.那么我应该怎么做才能AlertDialog在所有平台上正确显示列表项?提前致谢.
在我的Android应用程序中,我尝试按顺序1,2,3 ...等排序总线路由标记.
为此我正在使用它
Collections.sort(directions, Comparator { lhs, rhs ->
var obj1 = lhs.short_names.firstOrNull() ?: ""
var obj2 = rhs.short_names.firstOrNull() ?: ""
if (obj1 === obj2) {
obj1 = lhs.headsigns.firstOrNull() ?: ""
obj2 = rhs.headsigns.firstOrNull() ?: ""
if (obj1 === obj2) {
return@Comparator 0
}
obj1.compareTo(obj2)
} else {
obj1.compareTo(obj2)
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是对它们进行排序,但会遇到1,2,3,30,31,4,5的问题
我应该如何更改以获得正确的排序.
我有一个由Gson序列化/反序列化的枚举:
enum class PacketType {
NONE;
[SerializedName("request")]
REQUEST;
[SerializedName("response")]
RESPONSE;
[SerializedName("event")]
EVENT;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我注意到Gson忽略了SerializedName注释并使用大写名称来表示枚举值.我决定找出为什么序列化不能按预期工作,并发现Kotlin删除了枚举值的所有注释.如何使这些注释出现在生成的字节码中?
我需要在 Windows Server 2008 R2 上将一些事件从 Windows 事件日志导出到 XML。为了实现这一目标,我使用 EvtExportLog 将这些事件导出到文件,然后尝试使用 EvtArchiveExportedLog 获取事件的本地化描述。这是示例:
EvtExportLog( 0, 0, query, logFileName, EvtExportLogChannelPath );
EvtArchiveExportedLog( 0, logFileName, 0, 0 );
Run Code Online (Sandbox Code Playgroud)
EvtExportLog 函数成功并创建 .evtx 文件,但 EvtArchiveExportedLog 不断失败,并显示 ERROR_DIRECTORY 错误代码。我不知道这种行为的原因是什么。
我想添加一个项目长按一下监听器,它会将选择的图像设置为壁纸.我从网上获取图像并在网格视图中显示它们.我的网格活动如下所示.我已经有一个点击监听器来显示全屏图像.
public class ImageGridActivity extends BaseActivity {
String[] imageUrls;
DisplayImageOptions options;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.ac_image_grid);
Bundle bundle = getIntent().getExtras();
imageUrls = bundle.getStringArray(Extra.IMAGES);
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.stub_image)
.showImageForEmptyUri(R.drawable.image_for_empty_url)
.cacheInMemory().cacheOnDisc()
.bitmapConfig(Bitmap.Config.RGB_565).build();
GridView gridView = (GridView) findViewById(R.id.gridview);
gridView.setAdapter(new ImageAdapter());
// Set Long-Clickable
gridView.setLongClickable(true);
gridView.setOnItemLongClickListener(new OnItemLongClickListener() {
@SuppressLint("NewApi")
public boolean onItemLongClick(AdapterView<?> parent, View arg1,
int position, long arg3) {
// TODO Auto-generated method stub
ImageAdapter i = (ImageAdapter) parent.getAdapter();
Bitmap mBitmap = BitmapFactory.decodeResource(getResources(),
(int) i.getItemId(position));
// …Run Code Online (Sandbox Code Playgroud) 我有一个必须显示弹出窗口的按钮.并且弹出窗口必须与按钮的右侧对齐.我就是这样做的.
button.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick( final View view ) {
if(popup == null) {
final View view = getLayoutInflater().inflate(R.layout.popup, null);
popup = new PopupWindow(view);
}
if(popup.isShowing()) {
popup.dismiss();
} else {
popup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
popup.setFocusable(true);
popup.setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
popup.showAsDropDown(button, 0, 0);
}
}
} );
Run Code Online (Sandbox Code Playgroud)
此代码工作正常,但弹出窗口与按钮的左侧对齐.有没有一种简单的方法来改变PopupWindow的引力?
在 Java 中,可以像这样创建嵌套注释:
public @interface InnerInnotation {
String value();
}
public @interface OuterAnnotation {
InnerAnnotation[] value() default {
@InnerAnnotation("Hello"),
@InnerAnnotation("World")
}
}
annotation class InnerAnnotation(val value: String)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在 Kotlin 中做同样的事情时,我得到一个编译错误:
annotation class OuterAnnotation(
// Next line doesn't compile: "Annotation class cannot be instantiated"
val value: Array<InnerAnnotation> = arrayOf(InnerAnnotation("Test"))
)
Run Code Online (Sandbox Code Playgroud)
但是,单个实例注释字段工作正常:
annotation class OuterAnnotation(
val value: InnerAnnotation = InnerAnnotation("Hello World")
)
Run Code Online (Sandbox Code Playgroud)
有没有办法用嵌套的注释数组字段定义注释并为此字段指定默认值?
这是我的Activity类
public class A extends Activity
{
.......
.......
//here i have to call my test() method of B activity
new B.test();
}
Run Code Online (Sandbox Code Playgroud)
这是我的下一个活动
public class B extends Activity
{
......
public void test(){
//some code }
}
Run Code Online (Sandbox Code Playgroud)
但是test()方法并没有执行.我在test()方法中添加了Toast消息.但它没有显示Toast消息.如何调用test()方法.我哪里错了?我必须在B活动中覆盖onCreate()吗?请告诉我.提前致谢.