Android、UI 自定义视图中的元素
Android, UI Element in custom View
我已经习惯了在 android 中创建自定义视图。我想做的一件事是在我的自定义视图中包含现有的 UI 元素,例如 EditText
或 Switch
。
我之前使用 Cocoa (iOS) 进行过开发,并且能够在我的自定义视图中实例化本机元素。
在我看来 onDraw(Canvas canvas)
,我有:
edit = new EditText(getContext());
edit.setDrawingCacheEnabled(true);
Bitmap b = edit.getDrawingCache();
canvas.drawBitmap(b, 10, 10, paintDoodle);
当我执行时,应用程序在显示之前崩溃了。我是不是做错了,或者在 java 中不可能合并原生元素?
Logcat:
java.lang.NullPointerException
at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:739)
at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:91)
Is incorporation of native elements not possible in java?
不,有可能。
例如,您可以通过以下方式以编程方式创建 EditText:
LinearLayout layout = (LinearLayout) view.findViewById(R.id.linearLayout);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
EditText editText= new EditText(this);
editText.setLayoutParams(params);
layout.addView(editText);
如果你post你的自定义视图的代码,我也许能帮到你更多。
融入原生元素是非常非常有可能的,我每天都在做,但你做的非常错误。你不直接绘制它们,如果你真的在做自定义绘图,你只能直接绘制,如果你想要一个现有的视图在你的 CustomView 中,你将那个视图添加到你的 CustomView 中。
此外,永远不要永远永远永远永远不要在你的 onDraw
方法中分配 new
个对象。
我将展示一个我认为最简洁的方法的简单示例。
public class MyCustomWidget extends LinearLayout {
// put all the default constructors and make them call `init`
private void init() {
setOrientation(VERTICAL);
LayoutInflater.from(getContext()).inflate(R.layout.custom_widget, this, true);
// now all the elements from `R.layout.custom_widget` is inside this `MyCustomWidget`
// you can find all of them with `findViewById(int)`
e = (EditText) findViewById(R.id.edit);
title = (TextView) findViewById(R.id.title);
// then you can configure what u need on those elements
e.addTextChangedListener(this);
title.setText(...some value);
}
EditText e;
TextView title;
}
当然,您可以由此推断出更复杂的东西,例如,您有一个 User
对象,并且您的 MyCustomWidget
在您添加方法的适配器中:
public void setUser(User user) {
title.setText(user.getName());
}
我已经习惯了在 android 中创建自定义视图。我想做的一件事是在我的自定义视图中包含现有的 UI 元素,例如 EditText
或 Switch
。
我之前使用 Cocoa (iOS) 进行过开发,并且能够在我的自定义视图中实例化本机元素。
在我看来 onDraw(Canvas canvas)
,我有:
edit = new EditText(getContext());
edit.setDrawingCacheEnabled(true);
Bitmap b = edit.getDrawingCache();
canvas.drawBitmap(b, 10, 10, paintDoodle);
当我执行时,应用程序在显示之前崩溃了。我是不是做错了,或者在 java 中不可能合并原生元素?
Logcat:
java.lang.NullPointerException
at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:739)
at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:91)
Is incorporation of native elements not possible in java?
不,有可能。
例如,您可以通过以下方式以编程方式创建 EditText:
LinearLayout layout = (LinearLayout) view.findViewById(R.id.linearLayout);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
EditText editText= new EditText(this);
editText.setLayoutParams(params);
layout.addView(editText);
如果你post你的自定义视图的代码,我也许能帮到你更多。
融入原生元素是非常非常有可能的,我每天都在做,但你做的非常错误。你不直接绘制它们,如果你真的在做自定义绘图,你只能直接绘制,如果你想要一个现有的视图在你的 CustomView 中,你将那个视图添加到你的 CustomView 中。
此外,永远不要永远永远永远永远不要在你的 onDraw
方法中分配 new
个对象。
我将展示一个我认为最简洁的方法的简单示例。
public class MyCustomWidget extends LinearLayout {
// put all the default constructors and make them call `init`
private void init() {
setOrientation(VERTICAL);
LayoutInflater.from(getContext()).inflate(R.layout.custom_widget, this, true);
// now all the elements from `R.layout.custom_widget` is inside this `MyCustomWidget`
// you can find all of them with `findViewById(int)`
e = (EditText) findViewById(R.id.edit);
title = (TextView) findViewById(R.id.title);
// then you can configure what u need on those elements
e.addTextChangedListener(this);
title.setText(...some value);
}
EditText e;
TextView title;
}
当然,您可以由此推断出更复杂的东西,例如,您有一个 User
对象,并且您的 MyCustomWidget
在您添加方法的适配器中:
public void setUser(User user) {
title.setText(user.getName());
}