MHo*_*gge 7 android width android-layout android-databinding
我试图绑定我的视图的宽度和高度,但我看不出问题出在哪里.
我发现这个谷歌问题
要为您的应用程序实现这些,请创建绑定适配器:
Run Code Online (Sandbox Code Playgroud)@BindingAdapter("android:layout_width") public static void setLayoutWidth(View view, int width) { LayoutParams layoutParams = view.getLayoutParams(); layoutParams.width = width; view.setLayoutParams(layoutParams); }
所以我创建了我的绑定适配器,如下所示:
public class SimpleBindingAdapter {
@BindingAdapter("android:layout_width")
public static void setLayoutWidth(View view, int width) {
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
layoutParams.width = width;
view.setLayoutParams(layoutParams);
}
@BindingAdapter("android:layout_height")
public static void setLayoutHeight(View view, int height) {
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
layoutParams.height = height;
view.setLayoutParams(layoutParams);
}
//Others methods...
}
Run Code Online (Sandbox Code Playgroud)
然后尝试设置我的宽度和高度,如下所示:
<View
android:layout_width="@{paramsMessage.width}"
android:layout_height="@{paramsMessage.height}"
... />
Run Code Online (Sandbox Code Playgroud)
其中paramsMessage.width是一个public int属性.
但我得到这个错误:
引起:java.lang.RuntimeException:二进制XML文件行#25:您必须提供layout_width属性.在android.view.View.View的View.Avray.View.View.St上的android.content.res.TypedArray.getLayoutDimension(TypedArray.java:607)以及android.view.ViewGroup $ $ MarginLayoutParams.(ViewGroup.java:6930)在android.widget.RelativeLayout $ LayoutParams.(RelativeLayout.java:1244)android.widget.RelativeLayout.generateLayoutParams(RelativeLayout.java:1084)android.widget.RelativeLayout.generateLayoutParams(RelativeLayout.java:83)at android.view .LayoutInflater.rInflate(LayoutInflater.java:820)位于android.view.LayoutInflater.inflate(LayoutInflater.java:511)的android.view.LayoutInflater.inflate(LayoutInflater.java:415),位于android.databinding.DataBindingUtil.inflate(位于android.support.v4.app的be.standard.appbusiness.tutorials.home.TutorialHomeFragment.onCreateDialog(TutorialHomeFragment.java:35)的android.databing.DataBindingUtil.inflate(DataBindingUtil.java:88)中的DataBindingUtil.java:116) android.upport.v上的.DialogFragment.getLayoutInflater(DialogFragment.java:308)4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)位于android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)的android.support.v4.app.BackStackRecord.run(BackStackRecord.java: 738)在Android.support.v4.app.FragmentActivity的android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:330) .onStart(FragmentActivity.java:547)在android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1234)的android.app.Activity.performStart(Activity.java:6258)android.app.ActivityThread.performLaunchActivity(ActivityThread. java:2621)在android.app.A活动时,我在Android.app.ActivityThread.access $ 900(ActivityThread.java:172)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723)处于android.app.ActivityThread $ H.handleMessage(ActivityThread.java: 1422)在android.os.Handler.dispatchMessage(Handler.java:102)android.os.Looper.loop(Loope)r.java:145)在java.lang.reflect.Method.invoke的java.lang.reflect.Method.invoke(Native Method)的android.app.ActivityThread.main(ActivityThread.java:5832)上(Method.java: 372)com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1399)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
谢谢你们,我将不胜感激!
这已经很晚了,但对于需要它的人,我做了以下事情:
我在视图中将 layout_width 和 layout_height 设置为 0dp。
<ImageView
android:layout_width="0dp"
android:layout_height="0dp" />
Run Code Online (Sandbox Code Playgroud)
您可以将 minWidth / minHeight 与数据绑定一起使用,或者创建您自己的属性以通过绑定设置宽度和高度。
<ImageView
android:layout_width="0dp"
android:layout_height="0dp"
android:minWidth="@{controller.getDeviceWidthDP()}"
android:minHeight="@{controller.getDeviceWidthDP()}" />
Run Code Online (Sandbox Code Playgroud)
为每个属性创建 BindingAdapter,这里我使用 Kotlin。
object ViewBindings{
@JvmStatic
@BindingAdapter("android:minWidth")
fun setLayoutWidth(view: View, width: Float) {
val layoutParams = view.layoutParams
layoutParams.width = (width * view.resources.displayMetrics.density).toInt()
view.layoutParams = layoutParams
view.invalidate()
}
@JvmStatic
@BindingAdapter("android:minHeight")
fun setLayoutHeight(view: View, height: Float) {
val layoutParams = view.layoutParams
layoutParams.height = (height * view.resources.displayMetrics.density).toInt()
view.layoutParams = layoutParams
view.invalidate()
}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我使用了一个扩展函数来获取设备的宽度和高度尺寸。
fun Context.getDeviceDimensions(): Pair<Float, Float> {
var widthHeight = Pair(0.0F, 0.0F)
resources.displayMetrics.let {
val dpHeight = it.heightPixels / it.density
val dpWidth = it.widthPixels / it.density
widthHeight = Pair(dpWidth, dpHeight)
}
return widthHeight
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个控制器类并使用<data>标签将它包含在我的布局中。
class SomeController(val someFragment: SomeFragment){
fun getDeviceWidthDP(): Float{
val width = someFragment.context.getDeviceDimensions().first
return width
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1526 次 |
| 最近记录: |