GVKun编程网logo

用Kotlin在android中的UI组件上声明的最佳方法是什么?(android kotlin 教程)

10

如果您对用Kotlin在android中的UI组件上声明的最佳方法是什么?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于用Kotlin在android中的UI组件上声明的最

如果您对用Kotlin在android中的UI组件上声明的最佳方法是什么?感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于用Kotlin在android中的UI组件上声明的最佳方法是什么?的详细内容,我们还将为您解答android kotlin 教程的相关问题,并且为您提供关于android – 为字母的一部分着色的最佳方法是什么?、android – 保存ArrayList内容的最佳方法是什么?、android – 在AsyncTask中获取/使用Context的最佳方法是什么?、android – 拥有可重用对话框的最佳方法是什么?的有价值信息。

本文目录一览:

用Kotlin在android中的UI组件上声明的最佳方法是什么?(android kotlin 教程)

用Kotlin在android中的UI组件上声明的最佳方法是什么?(android kotlin 教程)

我正在尝试首次使用Kotlin构建android应用程序。

我想在OnCreate方法外的某些按钮上声明,并且只能在带有findViewById的此函数内对其进行初始化。

我可以像Java中那样用简单干净的代码声明吗?

private Button btnProceed;

因为当将其转换为Kotlin时,它看起来像:

private var btnProceed: Button? = null

然后在初始化OnClick函数时需要添加!标志:

btnProceed!!.setOnClickListener

什么是正确和最清洁的方法?

答案1

小编典典

这是一个很好的用例lateinit。标记属性lateinit可以使它成为不可为空的,但在调用Activity的构造函数时不为其赋值。正是在像Activity之类的类中,当初始化是在单独的初始化方法中发生,而不是在构造函数运行之后(在本例中为onCreate)时。

private lateinit var btnProceed: Button

如果在分配实值之前读取了该属性,它将在运行时引发异常-通过使用lateinit,您有责任在首次访问它之前对其进行初始化。


否则,如果希望编译器为您保证安全访问,则可以使Buttonnull为默认值,就像转换器所做的那样。但是,应该使用安全调用运算符来访问该属性,而不要使用转换器通常使用的不安全!!运算符:

btnProceed?.setOnClickListener { ... }

如果btnProceed为非null值,则将进行常规调用,否则不执行任何操作。


最后一点,您可以查看Kotlin Android扩展View,如果它适用于您的项目,则无需完全为您创建属性。


上一次编辑(目前):您还应该lazy按照中所述使用。懒惰很酷。other
answers

android – 为字母的一部分着色的最佳方法是什么?

android – 为字母的一部分着色的最佳方法是什么?

我希望实现这样的目标:

enter image description here

首先想到的是在画布上绘制文本两次,并用形状覆盖第一个文本.但也许有更好的解决方案.

解决方法

一种方法是使用PorterDuffXfermode在文本上合成蓝色矩形.您可以扩展TextView并覆盖onDraw()以在绘制文本后绘制矩形,并使用正确的模式(我相信XOR是您想要的那个)它应该达到预期的效果.像这样的东西:

public class ProgresstextView extends TextView {

    private static final float MAX_PROGRESS = ...;

    private Paint mPaint;

    public ProgresstextView(Context context) {
        super(context);
        initPaint();
    }

    /* other constructor omitted,but do the same pattern in those */

    private void initPaint() {
        mPaint = new Paint();
        mPaint.setColor(...);
        mPaint.setXfermode(new PorterDuffXfermode(Mode.XOR));
        // note: you may also need the following line if hardware accel is available
        setLayerType(LAYER_TYPE_SOFTWARE,null);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawProgress(canvas);
    }

    private void drawProgress(Canvas canvas) {
        int w = getWidth() - getPaddingLeft() - getPaddingRight();
        int h = getHeight() - getPaddingTop() - getPaddingBottom();
        float progress = getProgress();
        float rectW = w * (progress / MAX_PROGRESS);

        int saveCount = canvas.save();
        canvas.translate(getPaddingLeft(),getPaddingTop());
        canvas.drawRect(0,rectW,h,mPaint);
        canvas.restoretoCount(saveCount);
    }

    private float getProgress() {
        // Todo
    }
}

有关Porter / Duff合成的更多信息:http://ssp.impulsetrain.com/porterduff.html

android – 保存ArrayList内容的最佳方法是什么?

android – 保存ArrayList内容的最佳方法是什么?

我想保存一个ArrayList,以便它是持久的.内容可以改变.在 android中接近这个的最佳方法是什么?

解决方法

你的问题类似于问“我有这个东西 – 我应该将东西转移到盒子,桶,桶或箱子里吗?”.

不知道“东西”是什么,我们不能轻易回答这个问题.

您的一般选择是使用数据库(可能实际上首先摆脱了ArrayList)或持久化到文件(序列化,XML,JSON等).

一般来说,sqlite数据库具有优势,因为它使用事务并且通常比仅编写自己的文件更健壮.但是,您的ArrayList可能存储的内容在数据库中可能无法正常工作.当然,您的ArrayList可能存储的内容甚至可能根本不能保留(例如,套接字,小部件).

android – 在AsyncTask中获取/使用Context的最佳方法是什么?

android – 在AsyncTask中获取/使用Context的最佳方法是什么?

我通过扩展AsyncTask类来定义一个单独的线程.在这个类中,我在AsyncTask的onPostExecute和onCancelled方法中执行一些Toasts和Dialog.祝酒词需要应用程序的上下文,所以我需要做的就是:
Toast.makeText(getApplicationContext(),"Some String",1);

使用AlertDialog.Builder创建对话框,它还需要在其构造函数中使用上下文.我是否正确地认为这个背景应该是活动的背景?即

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

其中getActivity可以是返回当前活动的用户定义类.如果是这样,处理这种情况的最佳方法是什么?创建类似getActivity的类或将当前活动的上下文传递给AsyncTask的构造函数?

我想我正在尝试理解Context的使用 – 我注意到内存泄漏可能是一个问题(还没有真正理解这一点)以及如何使用getApplicationContext()是最好的方法.

解决方法

只需将AsyncTask创建为Activity的内部类,或将Context传递给AsyncTask的构造函数.

内部类:MyActivity.java

public class MyActivity extends Activity {

    // your other methods of the activity here...


    private class MyTask extends AsyncTask<Void,Void,Void> {

         protected Void doInBackground(Void... param) {

             publishProgress(...);  // this will call onProgressUpdate();
         }

         protected Void onProgressUpdate(Void... prog) {

             Toast.makeText(getActivity(),"text",1000).show(); 
         }
    }
}

构造函数:MyTask.java

public class MyTask extends AsyncTask<Void,Void> {

     Context c;

     public MyTask(Context c) {
          this.c = c;
     }

     protected Void doInBackground(Void... param) {

          publishProgress(...);  // this will call onProgressUpdate();
     }

     protected Void onProgressUpdate(Void... prog) {
          Toast.makeText(c,1000).show();
     }
}

此外,请不要忘记在对话框上调用.show().

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.show();

android – 拥有可重用对话框的最佳方法是什么?

android – 拥有可重用对话框的最佳方法是什么?

在 Android中创建可重用对话框的最佳方法是什么?

通过Dialog dev guide阅读,我知道我可以使用AlertDialog.Builder(这个);在我的一个活动中,但如果我想在多个活动中使用它,该怎么办?如果这是其他类,我会扩展它,所以MyDialog扩展AlertDialog,但后来我不能使用Builder.

有什么建议?

解决方法

创建一个类文件,如AllMethod.java,并在该类文件中添加此代码.

public static void showAlert(Activity act,String msg,DialogInterface.OnClickListener listener) {
        AlertDialog.Builder alert = new AlertDialog.Builder(act);
        alert.setMessage(msg);
        alert.setPositiveButton("OK",listener);
        alert.show();
    }

你可以使用任何类,如下面的代码.

AllMethod.showAlert(mActivity,"",new DialogInterface.OnClickListener() {
        @Override
         public void onClick(DialogInterface dialog,int which) {
         // Do your code for click
         }
});

关于用Kotlin在android中的UI组件上声明的最佳方法是什么?android kotlin 教程的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于android – 为字母的一部分着色的最佳方法是什么?、android – 保存ArrayList内容的最佳方法是什么?、android – 在AsyncTask中获取/使用Context的最佳方法是什么?、android – 拥有可重用对话框的最佳方法是什么?的相关信息,请在本站寻找。

本文标签: