Following snippet from my layout xml:
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="#id/fragment_home_info_card_car_position"
android:maxHeight="300dp"
>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:elevation="10dp">
<include
android:id="#+id/fragment_home_filter_chips"
layout="#layout/selection_chips"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp" />
</androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
wraps the content correctly, it wraps the include and doesn't exceed the height. But the content of the include get cut off approx 100dp down when scrolling. This may be because there is a rather slow fill of the include (in the background with a lifeCyclescope coroutine).
In my effort to overcome this I just constraint the height to a fixed value like this:
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="300dp"
app:layout_constraintTop_toBottomOf="#id/fragment_home_info_card_car_position"
>
...
Now suddenly the height of the include was correctly justified, and I could scroll down the bottom of it, but of course not constrained to the content if it was smaller than 300dp...
My question is, how do I constraint the height as in the first snippet and is sure that my include is fully expanded (viewed expanded inside the scrollview) ?
Do maxHeight do some "magic" that isn't quite well here ?
Below is my code: It generates a list with a horizontal separator after every item (Gives a feeling like the rows of the table).
I wish to display it like this instead:
Permissions:
Item 1
Item 2
Item 3
Even if bullet is not possible, at least, plain data one below the other would be nice. I do not want the separator in between.
<List id="PermissionsList"
noDataText="NoPermissions"
includeItemInSelection="true"
items="{PermissionsList>/}"
>
<headerToolbar>
<Toolbar>
<Title
text="Permissions"
level="H3"
/>
</Toolbar>
</headerToolbar>
<StandardListItem title="{PermissionsList>Text}"/>
</List>
You could try
<StandardListItem title="• {PermissionsList>Text}"/>
Which is the html code for bullet point. The alternative is adding a style class and using the :before selector to add whatever you like, it offers more flexibility in terms of styling.
To remove the separators, there's a flag for that:
showSeparators="None"
So the whole thing would be:
<List id="PermissionsList" showSeparators="None" noDataText="NoPermissions" items="{PermissionsList>/}" includeItemInSelection="true">
<headerToolbar>
<Toolbar>
<content>
<Title text="Permissions" level="H3"/>
</content>
</Toolbar>
</headerToolbar>
<StandardListItem title="• {PermissionsList>Text}"/>
</List>
I have a ListView in which I show some details including prices.
I need to show the total sum at the bottom of the ListView.
So far I've tried with a ListView to show the details and a table layout with a single row to show the total, the problem is that I can't get them to be aligned.
Do you know I can get a result like this one:
I know that the amount for "Cache" isn't the Total, but the idea is the same. All these rows show their amounts properly aligned and the space between the labels and the amount are filled with dots and this is the result I'd like to achieve, so I would be very grateful if you could help.
This is the layout I'm currently using for my activity
<?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:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical" >
<ListView
android:id="#+id/detailsListView"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:dividerHeight="1dp" >
</ListView>
</LinearLayout>
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:stretchColumns="0,1" >
<TableRow android:padding="1dp" >
<TextView
style="#style/Control.Label.Large.Stretched"
android:layout_weight="1"
android:text="#string/total" />
<TextView
android:id="#+id/totalSumTextView"
style="#style/Control.TextView.Large.Stretched"
android:layout_weight="1"/>
</TableRow>
<TableRow android:id="#+id/tableRow3" />
</TableLayout>
</LinearLayout>
An this is the layout for each item in the ListView :
<?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:orientation="vertical" >
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:stretchColumns="0,1" >
<TableRow android:padding="1dp" >
<TextView
style="#style/Control.Label.Small.Stretched"
android:layout_weight="1"
android:text="#string/item_quantity" />
<TextView
android:id="#+id/itemQuantityTextView"
style="#style/Control.TextView.Small.Stretched"
android:layout_weight="1" />
</TableRow>
<TableRow android:padding="1dp" >
<TextView
style="#style/Control.Label.Small.Stretched"
android:layout_weight="1"
android:text="#string/item_unit_price" />
<TextView
android:id="#+id/itemUnitPriceTextView"
style="#style/Control.TextView.Small.Stretched"
android:layout_weight="1" />
</TableRow>
<TableRow android:padding="1dp" >
<TextView
style="#style/Control.Label.Small.Stretched"
android:layout_weight="1"
android:text="#string/item_total" />
<TextView
android:id="#+id/itemTotalTextView"
style="#style/Control.TextView.Small.Stretched"
android:layout_weight="1" />
</TableRow>
</TableLayout>
</LinearLayout>
Each Item should look something like this :
And it's the sum of those totals that should be displayed below the ListView
This image is from what I'm trying to do. It's in Spanish, but it should give you a better picture of what I'm saying. As you can see the row below the ListView is not aligned with the values in the above it.
I see these problems in your screenshot:
alignment of the columns themselves is different
alignment of text in the columns is centred, not right-aligned
you probably want to use a fixed number of decimal points in your numeric output
row of dots
1) Alignment of columns
I think this is to do with using the TableLayout. As you can see in my previous example, I prefer to use RelativeLayout. When you get the hang of it you will see it is very powerful.
I would use my example below as a starting point for a single row, and make 2 more similar rows below that using the layout_below tag to position them below the row above.
Like this (long) example:
<?xml version="1.0" encoding="utf-8"?>
<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="wrap_content"
android:padding="16dp" >
<!-- ROW 1 -->
<TextView
android:id="#+id/tvLabel1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Cantidad Pedida" />
<TextView
android:id="#+id/tvSizeMb1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="#+id/tvLabel1"
android:layout_alignParentRight="true"
android:text="12.0" />
<!-- ROW 2 -->
<TextView
android:id="#+id/tvLabel2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="#+id/tvLabel1"
android:text="Unidad Medida" />
<TextView
android:id="#+id/tvSizeMb2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="#+id/tvLabel2"
android:layout_alignParentRight="true"
android:text="CJA" />
<!-- ROW 3 -->
<TextView
android:id="#+id/tvLabel3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="#+id/tvLabel2"
android:text="Precio Unitario" />
<TextView
android:id="#+id/tvSizeMb3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="#+id/tvLabel3"
android:layout_alignParentRight="true"
android:text="157.6036" />
</RelativeLayout>
2) Right-align the text within the columns
Your TextView items are being centred in the columns, due to using the layout_weight="1" tag. If you instead use the RelativeLayout as described above, the text views themselves are being set to the right.
3) Fixed format for your decimal numbers
To correctly align numbers, it helps to use a fixed number of decimal points. In your case it looks like you might need 4 decimal places.
When you set the values, you are probably doing something like:
myTextView.setText(String.valueOf(myNumber);
Instead of that, use the String.format() method to set the number of decimal places:
myTextView.setText(String.format("%.4f", myNumber);
For more info on that, check out this post:
Format Float to n decimal places
4) Row of dots between text fields
I was hoping to get something working with an XML Drawable that uses the stroke style, but ran into some strange issues. You might want to play around with that concept a bit.
However what I've done many times in the past is similar to what ArianJM recommends.
<View
android:layout_width="0dp"
android:layout_height="1px"
android:layout_alignBaseline="#+id/tvLabel1"
android:layout_toLeftOf="#+id/tvSizeMb1"
android:layout_toRightOf="#+id/tvLabel1"
android:background="#333"
tools:ignore="PxUsage" />
Note the use of px instead of dp for the height attribute. This creates a sharper image, and by using a 1px value, the line is not very strong. You could improve this by using a slightly transparent colour for the line.
Previous answer
You could use a basic ListView to display your items. The list view can use a custom XML layout for each item, that aligns the text the way you want it to.
For example, here is a RelativeLayout that aligns 2 text fields in the way you want them to be aligned:
<?xml version="1.0" encoding="utf-8"?>
<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="wrap_content"
android:padding="16dp" >
<TextView
android:id="#+id/tvLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:text="Total" />
<TextView
android:id="#+id/tvSizeMb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:text="4.57MB" />
</RelativeLayout>
Then below your list view, you would want to display your "Cache" row. Use the same layout for this, and the items will align correctly.
I think that for what you want to do you should make a custom layout for your ListView, and in that layout make a TextView element aligned to the right.
Your XML would contain something like this:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<TextView
android:id="#+id/price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="14.99$" />
</RelativeLayout>
That TextView is aligned to the right, add anything you want, then use the layout for every element in the ListView, all the TextViews should then be aligned.
The android:layout_alignParentRight="true" attribute makes the TextView (or any view with that attribute) be aligned to the right (inside it's parent).
Edit
For the dots you could use something like in this answer: https://stackoverflow.com/a/10282253/3290971
The full layout file would be something like:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content">
<TextView
android:id="#+id/item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Item"
android:textSize="20dp" />
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_toRightOf="#id/item"
android:layout_toLeftOf="#+id/price"
android:layout_alignBaseline="#+id/price"
android:background="#android:color/darker_gray" />
<TextView
android:id="#+id/price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="14.99$"
android:textSize="20dp" />
</RelativeLayout>
The result would be:
Not really dots, but that's something to start from, hope that helps.
#axel this is what I did to get a dotted line :
Create a xml file in the drawable folder and named dotted.xml. Copy and paste the following code:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line" >
<stroke
android:dashGap="3dp"
android:dashWidth="3dp"
android:color="#android:color/darker_gray" />
</shape>
and in your layout call the shape using the background attribute
<View
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_toRightOf="#id/item"
android:layout_toLeftOf="#+id/price"
android:layout_alignBaseline="#+id/price"
android:background="#drawable/dotted" />
In case the above code doesn't show the dotted line, add this to the View :
android:layerType="software"
Hope it helps
I've been using Bauerca's drag-sort-listview, it's easy enough to setup and use, but I'm having an issue where the entire list item is the handle instead of just the drawable I set as the handle. Here's the appropriate XML:
<com.mobeta.android.dslv.DragSortListView
xmlns:dslv="http://schemas.android.com/apk**/res-auto"
android:id="#+id/paletteView"
android:layout_width="match_parent"
android:layout_height="match_parent"
dslv:drag_handle_id="#id/dragHandle"
dslv:sort_enabled="true"
dslv:remove_enabled="false"
dslv:drag_start_mode="onDrag" />
And here's the XML for the list item layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Color View has to be set to specific width/height or else it won't show at all -->
<TextView
android:id="#+id/paletteItemText"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toLeftOf="#id/dragHandle"
android:textAlignment="center"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:minHeight="?android:attr/listPreferredItemHeightSmall" />
<View
android:id="#+id/colorView"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="#id/paletteItemText" />
<ImageView
android:id="#id/dragHandle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:src="#drawable/drag_handle" />
Notice the ImageVIew has the id of dragHandle which is used by the drag-sort-listview, that id isn't used anywhere else.
The biggest problem with this is it's making it so I can't press or long press the list item anymore.
AHAH!!! I figured it out, so the issue was actually quite simple, in the XML where I have this: xmlns:dslv="http://schemas.android.com/apk**/res-auto"
It should have been this: xmlns:dslv="http://schemas.android.com/apk/res/com.torygaurnier.openpalette"
I'm new to android development, so I didn't realize this, com.torygaurnier.openpalette is my package name, so the namespace has to point to your own package name.
i have used table layout for my one xml
i am trying to add one background image as follows:
android:background="#drawable/myimg"
den i am getting error like
02-28 11:58:57.713: E/AndroidRuntime(850): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test/com.test.Scan}: android.view.InflateException: Binary XML file line #3: Error inflating class android.widget.TableLayout
i have even tried like following:
<LinearLayout
android:id="#+id/linearLayout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#drawable/bkg1">
<TableLayout
android:id="#+id/linearLayout1_tblLayout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TableRow
android:id="#+id/linearLayout1_tblLayout1_tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center" >
......
</TableRow>
</TableLayout>
</LinearLayout>
then also i am getting same error.
please some one helppp me.!
Thank you.
sorry guyz , it was my mistake
i was using jpeg format's file.
when i used .png file.
i managed to solve my problem..
YOU CAN SET ONLY .PNG FORMAT'S FILE TO LAYOUT