ImageView Does Not android:layout_alignRight As Expected
Your TextView
s in the same LinearLayout
are wrap_content
wide. They can take up all the space in the parent LinearLayout
.
(Also android:layout_alignParentRight
is a RelativeLayout
attribute and has no effect in a LinearLayout
parent.)
One way to fix it is to make the videoInfo
LinearLayout
a RelativeLayout
and make the child positions relative to each other. E.g. make the button align to the right and add a constraint that the text view must be left to the button.
Layout params of loaded view are ignored
Use following statement to inflate:
View view = inflater.inflate( R.layout.item /* resource id */,
MyView.this /* parent */,
false /*attachToRoot*/);
Change margins programmatically doesn't work as expected
Be carefull, as you can read one the Reference: setMargins(int left, int top, int right, int bottom)
method use px
and your layout use dp
. You have to do a conversion like:
// where "dp" is your value dip
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
(float) dp, getResources().getDisplayMetrics());
// then set your margins
params.setMargins(0, px, 0, px);
See this answer: What is the correct way to specify dimensions in DIP from Java code? and the reverse one: Converting pixels to dp.
Also, you can read another thing one the Reference:
Sets the margins, in pixels. A call to requestLayout() needs to be done so that the new margins are taken into account.
Hope this helps.
Android constraint layout not working as intended
If you want to override layout_
parameters on an <include>
layout, you have to specify both layout_width
and layout_height
. From the developer docs:
However, if you want to override layout attributes using the
<include>
tag, you must override bothandroid:layout_height
andandroid:layout_width
in order for other layout attributes to take effect.
So add these two lines to your second view:
android:layout_width="0dp"
android:layout_height="0dp"
(Note that for ConstraintLayout
, 0dp
means to match the constraints)
Make a view take the rest of available space, if any
I think a custom view can solve your problem. I changed your layout a little bit and wrapped inside a custom relative layout. I checked widths of children OnLayout event of custom relative layout. If left is wider than bottom, right doesn't change. Otherwise, width of right is set to width difference. A boolean is kept for doing this operation only once. Otherwise, change in layout causes recursive call to OnLayout method.
Here is custom class:
public class CustomRelativeLayout extends RelativeLayout {
private boolean mIsLayoutSet = false;
public CustomRelativeLayout(Context context) {
super(context);
}
public CustomRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (!mIsLayoutSet) {
View left = findViewById(R.id.Left);
View right = findViewById(R.id.Right);
View bottom = findViewById(R.id.Bottom);
int leftWidth = left.getWidth();
int bottomWidth = bottom.getWidth();
if (bottomWidth > leftWidth) {
LayoutParams params = (LayoutParams) right.getLayoutParams();
params.width = bottomWidth - leftWidth;
right.setLayoutParams(params);
}
mIsLayoutSet = true;
}
}
}
and the usage of custom layout:
<com.rotasoftc.myapps.CustomRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/Left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Left"/>
<View
android:id="@+id/Right"
android:layout_width="0dp"
android:layout_toRightOf="@+id/Left"
android:layout_height="15px"
android:background="@android:color/black"
android:layout_marginTop="7dp"/>
<TextView
android:id="@+id/Bottom"
android:layout_width="wrap_content"
android:layout_height="23dp"
android:layout_below="@+id/Left"
android:layout_alignParentLeft="true"
android:textColor="#ffff00"
android:text="HelloHelloHelloHello"
android:lines="1"/>
</com.rotasoftc.myapps.CustomRelativeLayout>
Top-level Layout in Android XML is ALWAYS FrameLayout?
if you are setting only height then you may use more general ViewGroup.LayoutParams
. all layout params are extending it, so there is no chance for class cast, no matter of parent
val params = homeBottomSheetContainer.layoutParams as ViewGroup.LayoutParams
besides that you may use is
keyword for checking instance type
Why does LayoutInflater ignore the layout_width and layout_height layout parameters I've specified?
I've investigated this issue, referring to the LayoutInflater docs and setting up a small sample demonstration project. The following tutorials shows how to dynamically populate a layout using LayoutInflater
.
Before we get started see what LayoutInflater.inflate()
parameters look like:
- resource: ID for an XML layout resource to load (e.g.,
R.layout.main_page
) - root: Optional view to be the parent of the generated hierarchy (if
attachToRoot
istrue
), or else simply an object that provides a set ofLayoutParams
values for root of the returned hierarchy (ifattachToRoot
isfalse
.) attachToRoot: Whether the inflated hierarchy should be attached to the root parameter? If false, root is only used to create the correct subclass of
LayoutParams
for the root view in the XML.Returns: The root View of the inflated hierarchy. If root was supplied and
attachToRoot
istrue
, this is root; otherwise it is the root of the inflated XML file.
Now for the sample layout and code.
Main layout (main.xml
):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
Added into this container is a separate TextView, visible as small red square if layout parameters are successfully applied from XML (red.xml
):
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="#ff0000"
android:text="red" />
Now LayoutInflater
is used with several variations of call parameters
public class InflaterTest extends Activity {
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup parent = (ViewGroup) findViewById(R.id.container);
// result: layout_height=wrap_content layout_width=match_parent
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view);
// result: layout_height=100 layout_width=100
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view, 100, 100);
// result: layout_height=25dp layout_width=25dp
// view=textView due to attachRoot=false
view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
parent.addView(view);
// result: layout_height=25dp layout_width=25dp
// parent.addView not necessary as this is already done by attachRoot=true
// view=root due to parent supplied as hierarchy root and attachRoot=true
view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
}
}
The actual results of the parameter variations are documented in the code.
SYNOPSIS: Calling LayoutInflater
without specifying root leads to inflate call ignoring the layout parameters from the XML. Calling inflate with root not equal null
and attachRoot=true
does load the layout parameters, but returns the root object again, which prevents further layout changes to the loaded object (unless you can find it using findViewById()
).
The calling convention you most likely would like to use is therefore this one:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
To help with layout issues, the Layout Inspector is highly recommended.
Related Topics
Convert Xml to JSON Object in Android
Android Screen Lock/ Unlock Programmatically
What Is the Alternative to Android Orientation Sensor
Gradle Error:Execution Failed for Task ':App:Processdebuggoogleservices'
Textinputlayout :How to Give Padding or Margin to Hint
Cordova Android Requirements Failed: "Could Not Find an Installed Version of Gradle"
Accessing Files from Genymotion Sd Card
Resources$Notfoundexception: File Res/Drawable/Abc_Ic_Ab_Back_Material.Xml
Java.Io.Ioexception: Hostname Was Not Verified
How to Send the Sms More Than 160 Character
Can Android's Webview Automatically Resize Huge Images
How to Automatically Uninstall Android App from Device Before Installing a New Version
"You Need to Use a Theme.Appcompat Theme (Or Descendant) with the Design Library" Error
Inserting Contacts in Android 2.2
How to Play an Mp3 in the Res/Raw Folder of My Android App
Android: How to Programmatically Set the Size of a Layout
When a Fragment Is Replaced and Put in the Back Stack (Or Removed) Does It Stay in Memory