Horizontally aligning two TextViews in Constraintlayout - android-constraintlayout

Helllo!
I am currently learning the basics os JAVA and I can't quite figure a little thing out...
What I want to do: Horizontally align two TextViews in a CardView, while keeping them contrained to eachother
What I have tried:
Constraining them separately, this creates space between those two TextViews which I do not want.
Also I have played around with Chains, but couldn't quite get it to work (doing it wrong probably).
Lastly I tried searching this forum but could only find very big problems where mine did not fit into (relative layouts and others)
Image of the Android Editor: https://imgur.com/ICLPv8v
The pink circle is where Im having trouble with (too much space in between)
This is the code so far I've come up with :-)
FYI: I'm following the Android Basics: User Interface and it's been fun, this just seemed a bit too advanced for them, but I'm eager to learn!
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.cardview.widget.CardView
android:id="#+id/materialcard"
android:layout_width="200dp"
android:layout_height="200dp"
android:backgroundTint="#color/Gray200"
app:cardCornerRadius="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="#+id/Hi"
style="#style/Headline1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:elevation="2dp"
android:text="Hi"
android:textColor="#color/Gray900"
android:textStyle="bold"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="#+id/materialcard"
app:layout_constraintTop_toTopOf="#+id/materialcard" />
<TextView
android:id="#+id/ExclamationMark"
style="#style/Headline_bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:elevation="2dp"
android:text="!"
android:textAlignment="center"
android:textColor="#color/colorAccent"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="#+id/materialcard"
app:layout_constraintLeft_toLeftOf="#+id/materialcard"
app:layout_constraintStart_toEndOf="#+id/Hi"
app:layout_constraintTop_toTopOf="#+id/materialcard" />
</androidx.constraintlayout.widget.ConstraintLayout>```
[1]: https://i.stack.imgur.com/Fd8Jf.png

You can use this layout:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#color/cardview_dark_background">
<androidx.cardview.widget.CardView
android:id="#+id/materialcard"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintWidth_percent="0.7"
app:layout_constraintHeight_percent="0.4"
app:cardCornerRadius="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="#+id/Hi"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#color/colorPrimary"
app:layout_constraintWidth_percent="0.34"
app:layout_constraintHeight_percent="0.4"
android:elevation="2dp"
android:text="Hi"
android:textStyle="bold"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="#+id/materialcard"
app:layout_constraintTop_toTopOf="#+id/materialcard" />
<TextView
android:id="#+id/ExclamationMark"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="#color/colorAccent"
app:layout_constraintWidth_percent="0.34"
app:layout_constraintHeight_percent="0.4"
android:elevation="2dp"
android:text="!"
android:textAlignment="center"
android:textColor="#color/colorAccent"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="#+id/materialcard"
app:layout_constraintLeft_toLeftOf="#+id/materialcard"
app:layout_constraintStart_toEndOf="#+id/Hi"
app:layout_constraintTop_toTopOf="#+id/materialcard" />
</androidx.constraintlayout.widget.ConstraintLayout>
The important thing are those attributes:
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintWidth_percent="0.7"
app:layout_constraintHeight_percent="0.4"
By doing that, now your cardView will be be exactly 70% of the screen with and 40% of the screen hegiht.
And now if you look at the layout I have done that for the other views, allowing myself to control the space inside the cardView.

Related

ConstraintLayout 1.1.0 views cannot reference each other on the same edge?

The following code used to work fine in 1.0.2, but does not work in 1.1.0 stable - literally removes the effect of every other constraint in all views in the layout. Is there a reason or is it just a quirk? Took a while to hunt it down.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:app1="http://schemas.android.com/apk/res-auto">
<TextView
android:id="#+id/viewOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="#+id/viewTwo" <-- culprit
tools:text="View one"/>
<TextView
android:id="#+id/viewTwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app1:layout_constraintTop_toBottomOf="#+id/viewOne" <-- culprit
tools:text="View two"/>
</android.support.constraint.ConstraintLayout>
Removing one of the culprit constraints brings everything back to normal in 1.1.0.
Add app:layout_constraintTop_toTopOf="parent" to viewOne and it will work again. You can also remove app:layout_constraintBottom_toTopOf="#+id/viewTwo" and nothing will change since it is not needed.
Although the two views are vertically constrained, they are constrained to one another and nothing ties them to the container. The group will slide to the top by default if not otherwise constrained. It look like both will slide to the top in 1.1.0 and line up one below the other in 1.0.2. This may be just a side effect of how the views are defined.
In any case, the XML is not well-formed and the views should all be constrained either directly or indirectly to the containing ConstraintLayout. Make the changes above and all will be well.
Just remove
app:layout_constraintBottom_toTopOf="#+id/viewTwo"
from the above xml code and you are good to go.
Below given is the code that works perfectly well.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:app1="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="#+id/viewOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="View one" />
<TextView
android:id="#+id/viewTwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app1:layout_constraintTop_toBottomOf="#+id/viewOne"
tools:text="View two" />
</android.support.constraint.ConstraintLayout>
So in your case only
app:layout_constraintBottom_toTopOf="#+id/viewTwo" this is the culprit.

Android remove cardview padding

From everything I have read, I should have cardview:cardPreventCornerOverlap="false" in my XML file to prevent padding between each cardview.
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cardview="http://schemas.android.com/apk/res-auto"
xmlns:app="http://schemas.android.com/tools"
android:id="#+id/card_view"
cardview:cardPreventCornerOverlap="false"
cardview:cardUseCompatPadding="false"
cardview:cardBackgroundColor="#android:color/holo_green_light"
android:layout_width="match_parent"
android:layout_height="100dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="#+id/image"
android:layout_width="120dp"
android:layout_height="100dp"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true" />
<TextView
android:id="#+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:ellipsize="end"
android:layout_alignTop="#id/image"
android:layout_toEndOf="#id/image"
android:layout_toRightOf="#id/image"/>
<TextView
android:id="#+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:maxLines="2"
android:ellipsize="end"
android:layout_alignStart="#id/name"
android:layout_alignLeft="#id/name"
android:layout_below="#id/name" />
</RelativeLayout>
Yet, on my LG phone running 4.4.2, I am seeing white space i.e. padding between the cards. I deliberately set the background to light green.
Here is the screenshot.
enter image description here

Android ImageButton interaction

I wish to create the same activity like in google fit
And I created an activity with android:theme="#style/Theme.AppCompat.Light.NoActionBar">
<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"
android:background="#ddd"
android:orientation="vertical"
tools:context=".MainActivity">
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="12dp"
android:background="#null"
android:onClick="onPreferencesClick"
android:src="#drawable/ic_more_vert_grey600_24dp" />
But when I click on three dots button it doesn't have any push effect in ui, but onPreferencesClick works fine.
How to create pushable ImageButton?
The easiest way would be to create a custom selector, for example like this (drawable xml):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="#33000000"/>
<item android:drawable="#android:color/transparent"/>
</selector>
and apply it to the background of ImageButton

How to change subtitle color in listVIew

I have a listView. Each list item consists of a title and a subtitle under title. I want to change the color of the subtitle. Please help me to change.
This is the layout you can use to make a different color textview for your subtitle:
<?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"
android:background="#999999">
<TextView
android:id="#+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
Color Change on this text view
<TextView
android:id="#+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small Text"
android:textColor="#FFFFFF"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
After this you can make your own adapter and inflate your row and you will get the different color on your txtview in the listview you mentioned.
Hope this helps.

How to change TabWidget's background color from XML in Android

I have come across this problem. I have a tab widget on top of the view, with four tabs in it. I have been asked to change the background color of the whole tab view area. Not for any tab, but the whole area of that tab view.
I also been asked for not changing any source code for some branding reason. So I could only do it through xml file. I searched around but seems all solution is by using java code. So I wonder if there is a way that I could change the widget background color (just color, not images) by using only resources files?
Here is my layout file for the tab layout:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp"
>
<TabWidget
android:id="#android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#color/tabbackgroundcolor" />
<FrameLayout
android:layout_below="#android:id/tabs"
android:id="#android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="5dp"
/>
</RelativeLayout>
</TabHost>
You could see that I added "android:background="#color/tabbackgroundcolor"" in the TabWidget part, however it not work..
Thank you!