我尝试通过Java代码设置我的ImageButton
layout_gravity
,我希望ImageButton
呈现的方式就像 Orange 下图中的框架:
蓝色框架是一个垂直LinearLayout
作为“基础”布局,这是我尝试添加子布局的布局。
橙色和红色均为水平LinearLayout
。
橙色布局是我想要放置ImageButton
和TextView
的方式,这个是通过XML设置的
红色布局是我尝试通过Java代码模仿 Orange 布局的结果。
以下是设置 Orange 布局的XML代码,这是我想通过Java代码实现的效果:
<!-- Begin the Orange Layout -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/info_left_padding"
android:layout_marginRight="@dimen/info_right_padding" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:minHeight="@dimen/detail_min_line_item_height"
android:text="TextView" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageButton
android:id="@+id/imageButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
android:adjustViewBounds="true"
android:maxHeight="@dimen/abs__action_bar_default_height"
android:scaleType="fitCenter"
android:src="@drawable/navigation_cancel" />
</FrameLayout>
</LinearLayout>
以下是设置红色布局
的Java代码 int textHeight = (int)getResources().getDimension(R.dimen.detail_min_line_item_height);
int imgHeight = (int)getResources().getDimension(R.dimen.abs__action_bar_default_height);
TextView mTextView = new TextView(this);
ImageButton mDeleteButton = new ImageButton(this);
// Set Delete Button Padding
// mDeleteButton.setPadding(buttonPadding, buttonPadding, buttonPadding, buttonPadding);
// Set Imagebutton Scale type as fitCentre
mDeleteButton.setScaleType(ScaleType.FIT_CENTER);
// Set AdjustViewBounds
mDeleteButton.setAdjustViewBounds(true);
// Set max height of the image
mDeleteButton.setMaxHeight(imgHeight);
// Set the text appearance to be "large"
mTextView.setTextAppearance(this, android.R.style.TextAppearance_Large);
mTextView.setText(text);
// Set the minimum height of this textview
mTextView.setMinHeight(textHeight);
// Set the content of the textview to be centred
mTextView.setGravity(Gravity.CENTER_VERTICAL);
// Set the ImageButton's background image
mDeleteButton.setImageResource(R.drawable.navigation_cancel);
LinearLayout.LayoutParams hParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
LinearLayout hLayout = new LinearLayout(this);
// Set Margins
hParams.leftMargin = (int) getResources().getDimension(R.dimen.info_left_padding);
hParams.rightMargin = (int) getResources().getDimension(R.dimen.info_right_padding);
hParams.bottomMargin = (int) getResources().getDimension(R.dimen.text_layout_margin);
hLayout.setLayoutParams(hParams);
// Set orientation to horizontal
hLayout.setOrientation(LinearLayout.HORIZONTAL);
// The settings below is actually setting up some of the button's parameters
LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
buttonParams.gravity = Gravity.RIGHT;
mDeleteButton.setLayoutParams(buttonParams);
hLayout.addView(mTextView);
hLayout.addView(mDeleteButton);
layout_blue.addView(hLayout);
根据这样的SO帖子:Java method for android:layout_gravity我最初尝试先将ImageButton
放入FrameLayout
,然后设置此FrameLayout
的参数,如下所示:
FrameLayout buttonFrame = new FrameLayout(this);
FrameLayout.LayoutParams buttonParams = new FrameLayout.LayoutParams(android.widget.FrameLayout.LayoutParams.WRAP_CONTENT,
android.widget.FrameLayout.LayoutParams.WRAP_CONTENT,
Gravity.RIGHT | Gravity.CENTER_VERTICAL);
buttonFrame.setLayoutParams(buttonParams);
buttonFrame.addView(mDeleteButton);
但我的结果与上面的图像相同。后来我也尝试将LayoutParams
宽度更改为MATCH_PARENT only to find the
ImageButton`水平拉伸(是的,它被拉伸)
然后我尝试了在这两个SO帖子中发布的方法:
How to set layout_gravity programmatically?
How to set a button's parameters programatically
他们的方法是首先设置LinearLayout.Params
,然后将此参数应用于按钮(我在相关代码中发布的代码部分应用此方法)。简而言之就是:
// The settings below is actually setting up some of the button's parameters
LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
buttonParams.gravity = Gravity.RIGHT;
mDeleteButton.setLayoutParams(buttonParams);
然而,结果仍与上图所示相同。
由于我需要以编程方式稍后在 Blue 布局中添加更多子视图,我想知道是否有办法设置每个子布局,如橙色布局图像?
最后
我找到了一个与@Permita的答案非常相似的解决方案。
这是我的解决方案:
LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT);
textParams.weight = 1.0f;
mTextView.setLayoutParams(textParams);
答案 0 :(得分:1)
添加以下代码,它会将所有可用空间分配给textView,将按钮移动到布局的右侧,使其看起来像orangeLayout。
mTextView.setLayoutParams(LayoutParams param = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT, 1.0f));
答案 1 :(得分:0)
为TextView尝试layout_width =“0dp”layout_weight =“1”。这告诉TextView占用整个可用宽度,以便带有ImageView的FrameLayout将对齐到右边框。
<TextView
android:id="@+id/textView1"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:minHeight="@dimen/detail_min_line_item_height"
android:text="TextView" />
答案 2 :(得分:0)
为什么不尝试使用更复杂的LinearLayout
,而不是使用标准RelativeLayout
?有了它,您可以调整每个视图相对于其他视图的位置。您可以将橙色布局中的ImageButton
设置为android:layout_alignParentRight="true"
,这将设置附加到父布局右侧的按钮,在我的情况下为RelativeLayout
,但{{1}在你的。 Here是Android开发者网站上相对布局API指南的链接。