天道酬勤,学无止境

以编程方式将属性(边距、重力等)设置为 Android 视图(不使用 XML)(Set attributes (margin, gravity, etc…) to an Android view programmatically (without XML))

问题

我需要在我的 .java 活动类中创建一个 GUI(布局+视图)(我知道它更灵活,更容易使用 .xml 布局文件,但我现在不想使用它)。

我找不到任何 setGravity() (但是我无法弄清楚如何使用“Gravity”对象)或“View”对象的任何 setMargin() 方法。

最简单的方法是什么?

谢谢。

回答1

用于设置组件的边距。 下面的内容保留先前设置的现有边距,并将左边距设置为零。

TextView title = ((TextView)findViewById(R.id.default_panel_title))
final ViewGroup.MarginLayoutParams lpt =(MarginLayoutParams)title.getLayoutParams();

lpt.setMargins(0,lpt.topMargin,lpt.rightMargin,lpt.bottomMargin);

title.setLayoutParams(lpt);
回答2

您可以将重力添加到“布局”而不是“控件”。 尝试使用 setGravity() 将重力设置为任何线性/相对或框架布局; .

例如:

LinearLayout lll = (LinearLayout) findViewById(R.id.layoutname);
        lll.setGravity(Gravity.CENTER);

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Android中的gravity和layout_gravity有什么区别?(What is the difference between gravity and layout_gravity in Android?)
    问题 我知道我们可以为android:gravity和android:layout_gravity属性设置以下值: center center_vertical center_horizontal等 但是我对这两者感到困惑。 android:gravity和android:layout_gravity的用法有什么区别? 回答1 他们的名字应该可以帮助您: android:gravity设置的内容(即其子视图)重力View它的使用。 android:layout_gravity设置View或Layout相对于其父级的重力。 这里有一个例子。 回答2 内部-外部 gravity将内容排列在视图内部。 lay out _gravity自编视图的位置本身之外。 有时也有助于查看图片。 绿色和蓝色是TextViews ,其他两种背景颜色是LinearLayouts 。 笔记 layout_gravity不适用于RelativeLayout视图。 将其用于LinearLayout或FrameLayout视图。 有关更多详细信息,请参见我的补充答案。 视图的宽度(或高度)必须大于其内容。 否则gravity将不会有任何影响。 因此, wrap_content和gravity毫无意义。 视图的宽度(或高度)必须小于父视图。 否则, layout_gravity将不起作用。 因此, match
  • 如何以编程方式设置layout_gravity?(How to set layout_gravity programmatically?)
    问题 我的问题很简单, 如何以编程方式设置我的按钮layout_gravity? 我在互联网上找到了它,但它只是抛出了一个Nullpointer异常: Button MyButton = new Button(this); LinearLayout.LayoutParams lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams(); lllp.gravity=Gravity.RIGHT; MyButton.setLayoutParams(lllp); MyLinearLayout.addView(MyButton); 有什么办法吗? 回答1 爪哇 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); params.weight = 1.0f; params.gravity = Gravity.TOP; button.setLayoutParams(params); 科特林 val params = LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT
  • 如何在相对布局中以编程方式设置重力(How to set gravity in programmatically in a relativelayout)
    问题 如何在相对布局中以编程方式设置重力。 我有一个名为chat_viewer_message.xml的 XML 布局,如下所示: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/background" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="4dip" android:paddingBottom="4dip" android:gravity="left" android:background="@drawable/chat_bg_in"> <ImageView android:id="@+id/avatar" android:layout_width="32dip" android:layout_height="32dip" android:layout_marginLeft="4dip" android:src="@drawable/avatar_1_1" /> <TextView android:id="@+id
  • 在Android中使用负边距是一种不好的做法吗?(Is it a bad practice to use negative margins in Android?)
    问题 负边距演示: 场景 通过为其中一个视图设置负边距来重叠视图,以使其侵入另一视图的边界框。 思想 如果布局应该重叠,它似乎可以按照您期望的方式工作。 但是我不想在不知情的情况下遇到更大的问题。 模拟器,物理设备,用它命名,当您使用负边距时,一切似乎都可以正常工作,一个视图会侵入另一个视图的边界框,并且取决于在布局中声明的方式,该视图将位于另一个视图的上方或下方。 我还知道,自API 21以来,我们可以设置translationZ和height属性以使视图显示在其他视图之上或之下,但是我主要担心的事实是,在layout_margin属性的文档中明确规定应使用边距值积极的,让我引用: 摘抄: 在此视图的左侧,顶部,右侧和底部指定多余的空间。 此空间超出了此视图的范围。 保证金值应为正。 必须是尺寸值,该尺寸值是一个浮点数,后跟一个单位,例如“ 14.5sp”。 可用的单位是:px(像素),dp(与密度无关的像素),sp(基于首选字体大小的缩放像素),(英寸),mm(毫米)... 在未来的几年,因为最初提出这个问题,我还没有切缘阴性的任何问题,并尽量避免使用它们尽可能,但没有遇到任何问题,所以即使文档指出,我不是太担心它。 回答1 2010年,@ RomainGuy(Android核心工程师)表示,负边距具有未指明的行为。 在2011年,@
  • fill_parent和wrap_content有什么区别?(What's the difference between fill_parent and wrap_content?)
    问题 在Android中,布局小部件时, fill_parent (API级别8和更高版本中的match_parent )与wrap_content什么区别? 您是否可以找到任何文档? 我很想很好地理解它。 回答1 这两个属性都可以应用于View的(视觉控件)水平或垂直大小。 它用于根据其内容或父布局的大小设置“视图”或“布局”的大小,而不是显式指定尺寸。 fill_parent (API级别8及更高版本中已弃用fill_parent命名了MATCH_PARENT ) 将小部件的布局设置为fill_parent将迫使其扩展以占用其所放置的布局元素内的可用空间。这大致相当于将Windows窗体控件的dockstyle设置为Fill 。 将顶层布局或控件设置为fill_parent将强制其占据整个屏幕。 wrap_content 将View的大小设置为wrap_content将迫使其仅扩展到足以容纳其包含的值(或子控件)的程度。 对于控件(例如文本框(TextView)或图像(ImageView)),这将包裹所显示的文本或图像。 对于布局元素,它将调整布局的大小以适合作为其子级添加的控件/布局。 大致相当于将Windows窗体控件的Autosize属性设置为True。 在线文件 此处的Android代码文档中有一些详细信息。 回答2 fill_parent (已弃用) = match
  • TextView 以编程方式 Android(TextView programmatically Android)
    问题 我在以编程方式创建 textView 时遇到了一些问题。 我真的不知道如何解决它。 问题是: - 边距,我不希望我的 TextView 粘在一起。 - 文本不像标题那样在可绘制对象中居中 - 我希望昵称用户的消息向右对齐,尼克的消息向左对齐。 为此,我有这两个功能: private void appendSenderText(String message) { TextView msg = new TextView(ChatActivity.this); msg.setBackgroundResource(R.drawable.rectangle); msg.setText(message); msg.setPadding(10, 10, 10, 10); msg.setTextColor(getResources().getColor(R.color.white)); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT, Gravity.LEFT); params.setMargins(10, 10, 10, 10); msg.setLayoutParams(params)
  • In Android, how do I set margins in dp programmatically?(In Android, how do I set margins in dp programmatically?)
    问题 在这个,这个和这个线程中,我试图找到有关如何在单个视图上设置边距的答案。 但是,我想知道是否没有更简单的方法。 我将解释为什么我不想使用这种方法: 我有一个自定义按钮,它扩展了Button。 如果背景设置为默认背景以外的其他值(通过调用setBackgroundResource(int id)或setBackgroundDrawable(Drawable d) ),则我希望边距为0。 public void setBackgroundToDefault() { backgroundIsDefault = true; super.setBackgroundResource(android.R.drawable.btn_default); // Set margins somehow } 我想将页边距重置为-3dp(我已经在这里阅读了如何从像素转换为dp,因此,一旦我知道如何在px中设置页边距,就可以自己管理转换了)。 但是由于这是在CustomButton类中调用的,因此父级可以从LinearLayout到TableLayout有所不同,我宁愿不要让他获得其父级并检查该父级的实例。 我想那也将表现不佳。 另外,当调用(使用LayoutParams) parentLayout.addView(myCustomButton, newParams)
  • 如何删除 Android CheckBox 周围的填充(How to remove padding around Android CheckBox)
    问题 我需要把支票放在我的图像视图的右上角。 但是当我这样做时,我注意到我的复选框周围有一个默认的边距。 有没有办法去掉这个?? <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" > <ImageView android:id="@+id/thumbImage" android:layout_width="100dp" android:layout_height="132dp" android:layout_gravity="center" /> </FrameLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height=
  • 以编程方式为 LinearLayout 设置重力(Set gravity for LinearLayout programmatically)
    问题 我已按照说明为 Unity 制作新的 AdMob 插件。 广告显示正确,但底部位置有问题。 它们出现在屏幕顶部。 我已将重力设置为底部(对于 FrameLayout),但横幅广告再次显示在屏幕顶部。 我没有任何带有 LinearLayout/FrameLayout 标签的 .xml 文件。 这是所有代码: public class playads { private String adUnitID = "ca-app-pub-9578188175087140/5483276313"; private Activity activity; //Store the android main activity private AdView adView; //The AdView we will display to the user private LinearLayout layout; //The layout the AdView will sit on public playads () { activity = UnityPlayer.currentActivity; activity.runOnUiThread(new Runnable() { public void run(){ adView = new AdView(activity); adView
  • 以编程方式更改视图的右边距?(Change the Right Margin of a View Programmatically?)
    问题 可以在Java代码中动态更改此属性吗? android:layout_marginRight 我有一个TextView ,它必须将其位置动态地向左更改一些像素。 如何以编程方式进行? 回答1 编辑:一种不依赖于布局类型的更通用的方式(除了它是一种支持边距的布局类型): public static void setMargins (View v, int l, int t, int r, int b) { if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); p.setMargins(l, t, r, b); v.requestLayout(); } } 您应该检查文档中的TextView。 基本上,您将需要获取TextView的LayoutParams对象,并修改边距,然后将其设置回TextView。 假设它在LinearLayout中,请尝试如下操作: TextView tv = (TextView)findViewById(R.id.my_text_view); LinearLayout.LayoutParams params
  • Android:以编程方式设置视图样式(Android: set view style programmatically)
    问题 这是XML: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/LightStyle" android:layout_width="fill_parent" android:layout_height="55dip" android:clickable="true" android:orientation="horizontal" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" /> </RelativeLayout> 如何以编程方式设置style属性? 回答1 从技术上讲,您可以通过编程方式应用样式,并始终使用自定义视图: private MyRelativeLayout extends RelativeLayout { public MyRelativeLayout(Context context) { super(context, null, R.style.LightStyle); } } 当您以编程方式实例化视图时,将使用一个参数构造函数。 因此
  • 如何在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中的AbsoluteLayout?(Alternative to AbsoluteLayout in Android?)
    问题 如果不推荐使用AbsoluteLayout,可以使用什么代替它? 我已经完成了一个使用AbsoluteLayout的应用程序,但在不同的屏幕分辨率下效果不佳。 我之所以使用,是因为我可以设置按钮的X和Y位置。 我可以使用其他布局设置按钮的位置吗? 回答1 您可以按如下所述使用RelativeLayouts:设置视图的绝对位置 回答2 使用RelativeLayout并设置左右边距,例如 RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); lp.leftMargin = x; lp.topMargin = y; 回答3 考虑使用FrameLayout。 如果将孩子重力设置为TOP|LEFT则可以使用leftMargin和topMargin作为位置。 另外,您还可以通过更改重力来获得其他一些有用的定位机制。 回答4 如果您要完全控制视图在屏幕上的位置,只是为了扩展ViewGroup并自己实现AbsoluteLayout,我将建议您。 最简单的解决方案是使用现有的Layouts之一,并使用边距,填充,重力等,但是控制功能不会如此强大,并且可能会在diff设备屏幕上造成一些问题。 回答5
  • Android:CollapsingToolbarLayout 居中展开文本但不居中折叠文本(Android: CollapsingToolbarLayout centers expanded text but not collapsed text)
    问题 我有一个CollapsingToolbarLayout ,它被定义为在折叠和展开模式下居中: <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/rootLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="286dp"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsingToolbar" android:layout_width="match_parent" android:layout_height=
  • 在 android 中以编程方式创建布局 - 问题(Create Layout Programmatically in android - issue)
    问题 我正在使用以下代码动态创建 FrameLayout 我的布局 FrameLayout layout = new FrameLayout(this); FrameLayout.LayoutParams layoutparams=new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.FILL_PARENT,Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL); layout.setLayoutParams(layoutparams); webview=new WebView(this); webview.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT)); splashview=new ImageView(this); splashview.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup
  • Android 在 WPF 中的波纹效果(Android's Ripple Effect in WPF)
    问题 我喜欢 Android 的新动画,您可以在其中触摸控件(列表视图项、按钮等),它会执行如下简洁的动画: 我想知道如何为 WPF 中的所有“可点击”控件在全局范围内以一种很好的方式实现这一点。 我特别需要帮助的是如何在控件上创建圆圈。 我唯一想到的是为每个其他控件(按钮、单选按钮等)创建自己的用户控件,其中我有一个椭圆的父控件以及原始控件本身。 <UserControl> <Grid MouseLeftButtonDown="handler"> <Button/> <--- this would be the button which you normally would place </Grid > </UserControl> 然后在handler-method使用边距属性在点e.GetPosition(handler)上创建一个椭圆,然后e.GetPosition(handler)进行动画处理。 这个解决方案会起作用。 但是对于我想要连锁反应的每个控件都这样做会很麻烦。 基本上是这样的: void handler(object sender, MouseButtonEventArgs e) { Grid parent = (Grid)sender; Ellipse ellipse = new Ellipse(); ellipse.Height = 10; // would
  • 以编程方式创建约束以查看控制器边距(Programmatically creating constraints bound to view controller margins)
    问题 我正在尝试制作一个视图,该视图将作为一种“面板”,附加到视图控制器的右侧。 也就是说,它绑定到父视图控制器的尾部,顶部和底部边距,静态宽度为300 但是,我似乎无法正确解决问题,我要么打破约束,要么做某件事xcode告诉我是非法的。 我究竟做错了什么? 这是控制器中的代码 let myView = UIView() view.backgroundColor = UIColor.redColor() self.view.addSubview(view) let topConstraint = NSLayoutConstraint(item: myView, attribute: .Top, relatedBy: .Equal, toItem: self.topLayoutGuide, attribute: .Bottom, multiplier: 1, constant: 0) let trailingConstraint = NSLayoutConstraint(item: self.view, attribute: .TrailingMargin, relatedBy: .Equal, toItem: myView, attribute: .Trailing, multiplier: 1, constant: 0) let bottomConstraint =
  • 支持库的FloatingActionButton示例(FloatingActionButton example with Support Library)
    问题 最近,我阅读了以下帖子: Android设计支持库 Android支持库,版本22.2.0 FloatingActionButton 但是,它们都没有给我提供有关创建新的FloatingActionButton的详细示例。 很难理解,这就是为什么我要问这个问题。 谁能给我一个例子吗? 编辑 我刚刚在FloatingActionButton (FAB)上发现了一些问题,并且我想改善另一个答案。 请在下面查看我的答案。 回答1 因此,在您的build.gradle文件中,添加以下内容: compile 'com.android.support:design:27.1.1' AndroidX注意: Google引入了新的AndroidX扩展库来替代旧的支持库。 要使用AndroidX,首先请确保您已更新gradle.properties文件,编辑build.gradle以将compileSdkVersion设置为28 (或更高),然后使用以下行代替之前的compile行。 implementation 'com.google.android.material:material:1.0.0' 接下来,在您的themes.xml或styles.xml或其他内容中,确保进行设置-这是应用程序的强调色-以及FAB的颜色,除非您覆盖它(请参见下文): <item name=
  • 向动态 Android TextView 添加边距(Adding Margins to a dynamic Android TextView)
    问题 我已经浏览了一堆以前的答案,并尝试了标记为工作的代码,但到目前为止,我所做的一切都无法说服我在 runtme 创建的 TextView 从左到右完全填充屏幕。 我想在两边添加一个类似于普通 Toast 的边距。 之后,我可以为形状添加阴影。 这是我的表单布局。 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rel_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/tv1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:gravity="center_vertical|center_horizontal" android
  • 如何使GridLayout适合屏幕大小(How to make a GridLayout fit screen size)
    问题 GridLayout API文档很难学习...... 有谁能教我如何将子级View设置为具有LinearLayout “权重”? 现在看来,所有物件都放在左侧我已经尝试了很多次,但仍然无法像每个屏幕的一半一样宽。 编辑:我不知道当所有子项都为wrap_content时该怎么办......即使我想以特定大小设置某些图像,此类也可以帮助我制作ImageView wrap_content ...... ...它无法正常运行,我错过了某些设置吗? 回答1 注意:随着GridLayout的推出,水平线下方的信息不再准确,因为GridLayout自API级别21开始就适应了权重原理。 引用Javadoc: 多余的空间分布从API 21开始,GridLayout的剩余空间分布符合重量原则。 如果未指定权重,则遵循先前的约定,并且如果列和行的视图在其组内指定某种形式的对齐方式,则将其视为灵活的。 因此,视图的灵活性受其对齐方式的影响,对齐方式通常由设置孩子的布局参数的重力属性来定义。 如果沿给定的轴定义了权重或对齐方式,则该组件将在该方向上具有柔韧性。 如果未设置权重或对齐方式,则假定该组件不灵活。 同一行或列组中的多个组件被认为是并行运行的。 仅当其中的所有组件都是灵活的时,这样的组才是灵活的。 位于公共边界两侧的行和列组将被视为串联操作。 如果这两个元素之一组成的复合组是柔性的