小编Mic*_*ael的帖子

在Kotlin访问属性委托

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)

delegates properties kotlin

11
推荐指数
2
解决办法
2710
查看次数

捆绑包持续多长时间由SyncManager保留?

我有一个应用程序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补偿和同步将在以后运行一段时间.

  • 会在某个时候取消吗?多次软错误后?
  • 重启设备后会再次排队吗?

鉴于连接错误并且同步因软错误而多次失败:我想知道是否只是将同步请求排入队列,或者我是否必须自己提供某种持久性以确保在某些时候发送请求.

android android-syncadapter

10
推荐指数
1
解决办法
224
查看次数

Android:如何正确设置AlertDialog中列表项的文本颜色

我的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)

我认为,使用textAppearanceSmallInversetextAppearance属性设置文本参数的正确方法,它必须在所有设备上工作,但看来我错了.那么我应该怎么做才能AlertDialog在所有平台上正确显示列表项?提前致谢.

android themes android-alertdialog

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

按字符和长度排序字符串

在我的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的问题

我应该如何更改以获得正确的排序.

sorting kotlin

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

在Kotlin中注释Enum

我有一个由Gson序列化/反序列化的枚举:

enum class PacketType {
    NONE;
    [SerializedName("request")]
    REQUEST;
    [SerializedName("response")]
    RESPONSE;
    [SerializedName("event")]
    EVENT;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我注意到Gson忽略了SerializedName注释并使用大写名称来表示枚举值.我决定找出为什么序列化不能按预期工作,并发现Kotlin删除了枚举值的所有注释.如何使这些注释出现在生成的字节码中?

enums annotations gson kotlin

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

EvtArchiveExportedLog 失败并显示 ERROR_DIRECTORY

我需要在 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 错误代码。我不知道这种行为的原因是什么。

c++ windows winapi event-log

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

在GridView中设置项目长按侦听器

我想添加一个项目长按一下监听器,它会将选择的图像设置为壁纸.我从网上获取图像并在网格视图中显示它们.我的网格活动如下所示.我已经有一个点击监听器来显示全屏图像.

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)

android onitemclicklistener

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

改变PopupWindow的重力

我有一个必须显示弹出窗口的按钮.并且弹出窗口必须与按钮的右侧对齐.我就是这样做的.

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的引力?

android gravity popupwindow

4
推荐指数
1
解决办法
7424
查看次数

Kotlin 中的嵌套注释

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

有没有办法用嵌套的注释数组字段定义注释并为此字段指定默认值?

annotations nested kotlin

2
推荐指数
1
解决办法
1530
查看次数

如何从另一个活动中定义的一个活动中调用方法

这是我的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()吗?请告诉我.提前致谢.

android android-activity

0
推荐指数
1
解决办法
916
查看次数