如果您对用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 教程)
- android – 为字母的一部分着色的最佳方法是什么?
- android – 保存ArrayList内容的最佳方法是什么?
- android – 在AsyncTask中获取/使用Context的最佳方法是什么?
- android – 拥有可重用对话框的最佳方法是什么?
用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
,您有责任在首次访问它之前对其进行初始化。
否则,如果希望编译器为您保证安全访问,则可以使Button
null为默认值,就像转换器所做的那样。但是,应该使用安全调用运算符来访问该属性,而不要使用转换器通常使用的不安全!!
运算符:
btnProceed?.setOnClickListener { ... }
如果btnProceed
为非null值,则将进行常规调用,否则不执行任何操作。
最后一点,您可以查看Kotlin Android扩展View
,如果它适用于您的项目,则无需完全为您创建属性。
上一次编辑(目前):您还应该lazy
按照中所述使用。懒惰很酷。other
answers
android – 为字母的一部分着色的最佳方法是什么?
首先想到的是在画布上绘制文本两次,并用形状覆盖第一个文本.但也许有更好的解决方案.
解决方法
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内容的最佳方法是什么?
解决方法
不知道“东西”是什么,我们不能轻易回答这个问题.
您的一般选择是使用数据库(可能实际上首先摆脱了ArrayList)或持久化到文件(序列化,XML,JSON等).
一般来说,sqlite数据库具有优势,因为它使用事务并且通常比仅编写自己的文件更健壮.但是,您的ArrayList可能存储的内容在数据库中可能无法正常工作.当然,您的ArrayList可能存储的内容甚至可能根本不能保留(例如,套接字,小部件).
android – 在AsyncTask中获取/使用Context的最佳方法是什么?
Toast.makeText(getApplicationContext(),"Some String",1);
使用AlertDialog.Builder创建对话框,它还需要在其构造函数中使用上下文.我是否正确地认为这个背景应该是活动的背景?即
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
其中getActivity可以是返回当前活动的用户定义类.如果是这样,处理这种情况的最佳方法是什么?创建类似getActivity的类或将当前活动的上下文传递给AsyncTask的构造函数?
我想我正在尝试理解Context的使用 – 我注意到内存泄漏可能是一个问题(还没有真正理解这一点)以及如何使用getApplicationContext()是最好的方法.
解决方法
内部类: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 – 拥有可重用对话框的最佳方法是什么?
通过Dialog dev guide阅读,我知道我可以使用AlertDialog.Builder(这个);在我的一个活动中,但如果我想在多个活动中使用它,该怎么办?如果这是其他类,我会扩展它,所以MyDialog扩展AlertDialog,但后来我不能使用Builder.
有什么建议?
解决方法
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 – 拥有可重用对话框的最佳方法是什么?的相关信息,请在本站寻找。
本文标签: