天道酬勤,学无止境

How to set Layoutparams height/width in dp value?

问题

我尝试在按钮中手动设置高度/宽度,但它不起作用。 然后实现了Layoutparams。 但是尺寸显示很小并且没有获得所需的 dp 值。

XML

 <Button
    android:id="@+id/itemButton"
    android:layout_width="88dp"
    android:layout_height="88dp"
    android:layout_marginRight="5dp"
    android:layout_marginBottom="5dp"
    android:background="#5e5789"
    android:gravity="bottom"
    android:padding="10dp"
    android:text=""
    android:textColor="#FFF"
    android:textSize="10sp" />

构造函数:

  public Item (int id, String name, String backgroundColor, String textColor, int width, int height){
    this.id = id;
    this.name = name;
    this.backgroundColor = backgroundColor;
    this.textColor = textColor;
    this.width = width;
    this.height = height;

}

适配器:

@Override public void onBindViewHolder(final ViewHolder holder, int position) {
    final Item item = items.get(position);
    holder.itemView.setTag(item);
    holder.itemButton.setText(item.getName());
    holder.itemButton.setTextColor(Color.parseColor(item.getTextColor()));
    holder.itemButton.setBackgroundColor(Color.parseColor(item.getBackgroundColor()));
    ViewGroup.LayoutParams params = holder.itemButton.getLayoutParams();
    params.width = item.getWidth();
    params.height = item.getHeight();
    holder.itemButton.setLayoutParams(params);

}
回答1

当您在LayoutParams中以编程方式指定值时,这些值应为像素。

要在像素和 dp 之间进行转换,您必须乘以当前密度因子。 该值在DisplayMetrics中,您可以从Context访问:

float pixels =  dp * context.getResources().getDisplayMetrics().density;

所以在你的情况下,你可以这样做:

.
.
float factor = holder.itemView.getContext().getResources().getDisplayMetrics().density;
params.width = (int)(item.getWidth() * factor);
params.height = (int)(item.getHeight() * factor);
.
.
回答2
val layoutParams = layoutParams
val width = context.resources.getDimensionPixelSize(R.dimen.width_in_dp)
layoutParams.width = width
回答3

选项 1:使用 dimens.xml

view.updateLayoutParams {
    width = resources.getDimensionPixelSize(R.dimen.my_width)
    height = resources.getDimensionPixelSize(R.dimen.my_height)
}

选项 2:无需使用 dimens.xml

/** Converts dp to pixel. */
val Int.px get() = (this * Resources.getSystem().displayMetrics.density).toInt()
view.updateLayoutParams {
    width = 100.px
    height = 100.px
}
回答4
  ViewGroup.LayoutParams params = ListView.getLayoutParams();
        params.height = (int) (50 * customsDebts.size() * (getResources().getDisplayMetrics().density));
        params.width = ViewGroup.LayoutParams.MATCH_PARENT;
        ListView.setLayoutParams(params);

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • How to set Layoutparams height/width in dp value?
    I tried setting height/width manually in button but it didn't work. Then implemented Layoutparams. But size shows small and not getting required dp value. XML <Button android:id="@+id/itemButton" android:layout_width="88dp" android:layout_height="88dp" android:layout_marginRight="5dp" android:layout_marginBottom="5dp" android:background="#5e5789" android:gravity="bottom" android:padding="10dp" android:text="" android:textColor="#FFF" android:textSize="10sp" /> Constructor: public Item (int id, String name, String backgroundColor, String textColor, int width, int height){ this.id = id; this
  • 如何设置DialogFragment的宽度和高度?(How to set DialogFragment's width and height?)
    问题 假设我在名为my_dialog_fragment.xml的xml布局文件中指定了DialogFragment的布局,并且将其根视图的layout_width和layout_height值指定为固定值(例如100dp )。 然后,我在DialogFragment的onCreateView(...)方法中将此布局充气,如下所示: View view = inflater.inflate(R.layout.my_dialog_fragment, container, false); 令人遗憾的是,我发现DialogFragment出现时,它不遵守在其xml布局文件中指定的layout_width和layout_height值,因此它会根据其内容缩小或扩展。 有人知道我是否或如何使DialogFragment尊重其xml布局文件中指定的layout_width和layout_height值? 目前,我必须在DialogFragment的onResume()方法中再次指定Dialog的宽度和高度,如下所示: getDialog().getWindow().setLayout(width, height); 问题在于,我必须记住将来要在两个地方对宽度和高度进行任何更改。 回答1 如果直接从资源值转换: int width = getResources()
  • 如何在 GridLayoutManager 中设置项目行的高度(How to set the height of an item row in GridLayoutManager)
    问题 我的回收项在 onCreateViewHolder 中膨胀 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:padding="16dp"> <ImageView android:id="@+id/gridListImageView" android:layout_width="96dp" android:layout_height="96dp" android:src="@drawable/a" /> <TextView android:id="@+id/gridListView_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text=
  • 如何在 GridLayoutManager 中设置项目行的高度(How to set the height of an item row in GridLayoutManager)
    问题 我的回收项在 onCreateViewHolder 中膨胀 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" android:padding="16dp"> <ImageView android:id="@+id/gridListImageView" android:layout_width="96dp" android:layout_height="96dp" android:src="@drawable/a" /> <TextView android:id="@+id/gridListView_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:text=
  • FloatingActionButton visible for sometime even if visibility is set to gone
    问题 我的 LinearLayout 中有一个 FAB(FloatingActionButton)。 我希望 LinearLayout 被隐藏,即可见性首先设置为消失,然后单击菜单按钮它应该变得可见。 一切正常,但 FAB 在隐藏之前保持可见一段时间。 我尝试了从改变 FAB 的可见性到使用 hide() 和 show() 的所有方法,但没有任何效果。 我得到了以下链接,但由于某种原因,它们对我不起作用。 FloatingActionButton 始终可见 Gone FAB 暂时可见 FloatingActionButton 不隐藏 我的activity_main.xml: <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent">
  • 调整 imageView 的大小使它改变它的位置(resizing the imageView makes it change its place)
    问题 我有一个相对布局,其中包含很少的图像,如下所示。 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/image_2" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignLeft="@+id/increase" android:layout_alignParentTop="true" android:layout_marginLeft="34dp" android:layout_marginTop="34dp" android:src="@drawable/ic_launcher" /> <ImageView android:id="@+id/image_1" android:layout_width="30dp" android:layout_height="30dp"
  • 在 setimagebitmap 之后 imageview 的高度和视图搞砸了(Height and view of imageview screws up after setimagebitmap)
    问题
  • 以编程方式将按钮宽度设置为父 LinearLayout 的 50%(Programmatically set button width to 50% of parent LinearLayout)
    问题 我使用 LinearLayout 创建了一个对话框,在这个对话框中,我有一个按钮。 我想将其宽度设置为 Dialog 宽度的 50%,但无论我做什么,按钮仍会填充整个宽度。 主要问题似乎是我无法以编程方式设置按钮的权重。 我尝试创建第二个水平 LinearLayout 来保持权重设置为 0.5f 的按钮(父级的 weightSum 为 1),但这并没有改变任何东西。 如何将按钮设置为宽度的一半? 我已经查看了所有其他问题,但其中大多数都使用 xml,因此它们不相关,而以编程方式解决它的问题是使用以像素为单位的硬编码值,这显然是问题的错误解决方案。 编辑:添加一些代码 LinearLayout linearLayout = new LinearLayout(mContext); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setWeightSum(1); // I use these params when I call addContentView LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout
  • 如何制作带有圆角的ImageView?(How to make an ImageView with rounded corners?)
    问题 在Android中,默认情况下,ImageView是一个矩形。 如何在ImageView中使其成为一个圆角矩形(将Bitmap的所有4个角都切掉为圆角矩形)? 回答1 这是很晚的响应,但是对于正在寻找它的其他任何人,您可以执行以下代码来手动使图像变圆。 http://www.ruibm.com/?p=184 这不是我的代码,但是我已经使用了它,并且效果很好。 我将其用作ImageHelper类中的帮助器,并对其进行了扩展,以传递给定图像所需的羽化量。 最终代码如下所示: package com.company.app.utils; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Bitmap.Config; import android.graphics.PorterDuff.Mode; public class ImageHelper { public static Bitmap
  • 以编程方式更改 Android 中的 DatePicker 日历大小(Change DatePicker calendar size in Android programmatically)
    问题 我正在做一个 Android 应用程序,我必须显示一个 DatePickerDialog。 事实上,该应用程序将位于具有智能屏幕的设备上,而日历不适合其中。 我希望日历更小,同时保持相同的比例。 看起来像这样 我尝试使用 DatePicker 上的ScaleY和ScaleX函数来调整它的大小,但它只是调整了所有 DatePicker 的大小。 像这样 这是我用来显示 DatePickerDialog 的代码 public void ShowDate() { final Calendar c = Calendar.getInstance(); year = c.get(Calendar.YEAR); month = c.get(Calendar.MONTH); day = c.get(Calendar.DAY_OF_MONTH); DatePickerDialog dateForm = new DatePickerDialog(ViewForm.this, R.style.ColorOne, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) { }
  • 用固定的宽高比SurfaceView填充剩余空间(Fill remaining space with fixed aspect ratio surfaceview)
    问题 我想布局如下所示的视图,但不确定如何去做: 屏幕底部是固定大小的常规视图(填充宽度和高度的dp值) 填充剩余的垂直空间,我想放置一个继承自glSurfaceView的自定义视图,但要限制它必须具有固定的宽高比,这将以编程方式设置,但必须在创建活动之前知道。 (在这种情况下,假设为2:3 w:h)。 这是我在想像的一幅小图: .----------------------. | .--------------. | | b | | b | | g | | g | | | | | | i | MySurface | i | | m | View | m | | a | | a | | g | (2:3 w:h) | g | | e | | e | | *--------------* | |.--------------------.| || || || SomeOtherView || || || |*--------------------*| *----------------------* 就设置MySurfaceView而言,我认为正常的layout_width和layout_height不会对我有帮助,因为直到将屏幕部分布局并放置SomeOtherView后,我才知道可用的屏幕大小。 我想重写MySurfaceView中的某些功能,例如将可用屏幕空间作为参数传递
  • 如何动态更改ImageView高度(How to dynamically change ImageView Height)
    问题 我有一个简单的线性布局用于ListView的单元格,并且它具有imageview。 图像将从互联网上下载,因此大小可以不同。 但是,我想将imageview的宽度设置为fill_parent,它是固定的,并在运行时动态更改图像高度。 设置图像高度的规则:如果图像的高/宽比大于1,则将ImageView变为正方形,表示将高度与宽度匹配。 如果图像的h / w比率小于1,请按比例调整大小。 预期如下两个样本。 第一个是h / w <1,而第二个“猫”是h / w> 1。 谢谢你的时间。 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@color/white" android:orientation="vertical" android:padding="10dp" > <TextView android:id="@+id/postTitle" android:layout_width="fill_parent" android:layout_height="wrap_content" android
  • 动态使用 RelativeLayout 并以 px、dp、inch、mm 为单位设置边距(Using RelativeLayout dynamically and setting margins in px, dp, inch, mm)
    问题 我的应用程序只是一个经过修改的 ImageViewer,带有缩放和拖动选项。 包含修改后的 Imageviewer 有一个 RelativeLayout(我想用作 AbsoluteLayout)。 然后,可以将新元素添加到布局中以将它们放置在图像的某些点上。 元素的像素位置 (x, y) 在数据库中,所以我想没有其他方法可以以编程方式添加它们,而不是使用 XML。 然后每次执行拖动或缩放操作时更新这些元素的位置。 问题是不知何故图像的像素与RelativeLayout中的像素不匹配! 所以这些项目“或多或少”位于但不在正确的位置(离(0,0)越远,误差越大)。 我已经尝试过的事情: 尝试不同的转换,因为问题可能与 Bitmap 和 Layout 之间的密度差异有关: Resources r = getResources(); float x = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, r.getDisplayMetrics()); 尝试在布局中使用不同的方法来设置边距: RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT
  • 我无法在 Mapbox 的自定义信息窗口中放大视图。 (使用图像设置 getinfowindow)(I can't inflate a view in a custom infowindow in Mapbox. (Setting getinfowindow with images))
    问题 我正在使用 Mapbox 和 Android Studio IDE 为 Android 制作地图指南,但我很难处理自定义信息窗口。 我想膨胀信息窗口(单击标记后的那个),但到目前为止我想使用 XML 来进行简单的自定义(我愿意接受建议,我仍然需要为每个添加不同的图像标记。)。 我在代码本身中使用自定义只是为了测试,但我想为此目的膨胀 XML。 下面的图片显示了我正在为视图开发的原型,下一张图片显示了我从测试中实际得到的结果(代码在 getInfoWindow 函数中)我正在使用以下代码进行开发: XML 中的原型(其中:ID-Translation-Type) 我得到了什么 下面是我正在使用的地图代码部分,下一个代码显示了 XML 代码。 主要代码(Mapa.Java): protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MapboxAccountManager.start(this,getString(R.string.access_token)); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.mapView); mapView
  • 如何使customAdapter填充gridview高度(How to make customAdapter fill gridview height)
    问题
  • 在Android上动态更改linearlayout的宽度或高度(Dynamically changing the linearlayout width or height on Android)
    问题 我正在尝试动态更改线性布局或任何其他小部件的宽度或高度,但会抛出异常。 我的布局是: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/abc" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="ghghjkgj ghjg hjgj ghj g hjgjgh jhg " /> </LinearLayout> 我的活动是: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LinearLayout ll = (LinearLayout
  • 如何从中心裁剪为ImageView设置动画以填充屏幕,反之亦然(facebook风格)?(How to animate ImageView from center-crop to fill the screen and vice versa (facebook style)?)
    问题 背景 Facebook应用在帖子上的小图像与用户可以放大到它的放大模式之间具有很好的过渡动画。 正如我所看到的,动画不仅根据其先前的位置和大小来放大和移动imageView,而且还显示内容而不是拉伸imageView的内容。 这可以从我制作的下一个草图中看出: 问题 他们是如何做到的呢? 他们真的有2个动画可以显示内容吗? 他们如何使它像单一视图一样流畅? 当缩略图设置为中心裁剪时,我看到的唯一的教程(此处链接)放大到全屏图像的效果不佳。 不仅如此,它甚至可以在Android的API较低的情况下使用。 有人知道具有类似功能的图书馆吗? 编辑:我找到了一种方法并发布了答案,但是它基于更改layoutParams,我认为它效率不高,建议使用。 我尝试使用普通的动画和其他动画技巧,但是到目前为止,这是唯一对我有用的方法。 如果有人知道该怎么做才能使其更好地工作,请写下来。 回答1 好的,我找到了一种可能的方法。 我已经使用nineOldAndroids库的ObjectAnimator将layoutParams设置为不断变化的变量。 我认为这不是实现它的最佳方法,因为它会导致大量的onDraw和onLayout,但是如果容器只有几个视图并且不更改其大小,也许就可以了。 假设我动画的imageView最终将获得所需的确切大小,并且(当前)缩略图和动画imageView都具有相同的容器
  • 如何在TextView中将文本水平和垂直居中?(How do I center text horizontally and vertically in a TextView?)
    问题 如何在TextView水平和垂直居中放置文本,以使其准确显示在Android TextView的中间? 回答1 我假设您正在使用XML布局。 <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="@string/**yourtextstring**" /> 您也可以根据需要使用重力center_vertical或center_horizontal 。 就像@stealthcopter在Java中评论的那样: .setGravity(Gravity.CENTER); 回答2 android:gravity="center" 这将解决问题 回答3 您还可以使用以下方法动态设置它: textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL); 回答4 android:layout_centerInParent="true" 与RelativeLayout一起使用时,该布局的高度和宽度均设置为wrap_content。 回答5 您也可以使用以下组合: android:gravity="left|center"
  • Android:设置按钮高度与宽度相同(Android: set button height same as width)
    问题 这是我布局的一部分。 我需要按钮是完美的正方形。 一排会有4个按钮。 滚动视图中将有更多行。 每行都适合任何屏幕尺寸的屏幕宽度。 我已经尝试了很多解决方案,但没有我想要的。 然后我还需要将文本动态作为按钮,以便它每次都填充按钮宽度。 有什么解决办法吗? 我正在尝试这个几周。 <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="10dp"> <Button android:id="@+id/button4" android:layout_width="match_parent" android:text="@string/r1960" android:textColor="#ffffff" android:textSize="@dimen/loptatext" android:shadowColor="#000000" android:shadowRadius="7" android:layout_weight="1" android:background="@drawable
  • 当列表视图行项目中包含隐藏视图时,片段不尊重匹配的父高度(Fragment doesn't respect match parent height when having listview row item has hidden view in it)
    问题 我的应用程序中有一个奇怪的问题。 在我的一个应用程序活动中,我使用选项卡来膨胀其中的三个片段。 一切正常。 在我遇到问题的片段中,我有列表视图,它使用来自 Web 服务的适配器和数据膨胀。 这也很有效。 现在的问题是,在适配器中膨胀的行有一个隐藏视图,在 xml 中visibility=gone 。 在从该行点击 imageview 时,我通过 java 代码使该布局可见。 问题是布局在点击时不可见。 我什至在 imageview 的 onClickListener 上设置了断点,它确实执行了将可见性从消失变为可见的行。 我无法理解导致此问题的原因,因为我在其他屏幕中使用具有相同数据的同一行 xml,并且它运行良好。 更新 我知道是什么导致了这个问题,但不知道如何解决这个问题。 在我的活动中,我有三个片段。 我为片段提供的视图(其中片段将被膨胀)导致主要问题。 我已经设置了高度宽度以匹配父级,但它没有匹配父级高度。 如果片段只包含像 textview、imageview 这样的普通视图,那么片段也会正确显示。但问题是如果片段包含列表视图,那么它只需要提供给列表视图的自定义行的高度。 我可以在那个空间滚动完整的列表视图。 我不明白是什么导致了这种行为。 我的更新代码。 主要布局xml <?xml version="1.0" encoding="utf-8"?>