RSS

Most votes on android-layout questions 3

Most votes on android-layout questions 3. #21 Navigation Drawer (Google+ vs. YouTube) #22 Android toolbar center title and custom font #23 How to set space between listView Items in Android #24 LinearLayout not expanding inside a ScrollView #25 How to build a Horizontal ListView with RecyclerView? #26 How to set layout_gravity programmatically? #27 What is the purpose of Android's <merge> tag in XML layouts? #28 Calling setCompoundDrawables() doesn't display the Compound Drawable #29 Changing EditText bottom line color with appcompat v7 #30 RecyclerView inside ScrollView is not working

Read all the top votes questions and answers in a single page.

#21: Navigation Drawer (Google+ vs. YouTube) (Score: 404)

Created: 2012-07-07 Last updated: 2018-09-16

Tags: android, android-layout, user-interface, navigation-drawer

Does anyone know how to implement a sliding menu like some of the top apps of today?

Other Stack Overflow questions haven’t had any answers on how to do this, so I’m trying to gather as much info to help out others. All the applications I mention below do a great job of implementing the slide menu.

  1. Google Plus (as of 7/7/12)

Google+ slide out menu screenshot

You can only go from the first screen to the second screen by clicking the G+ logo in the upper left hand corner. Notice that the entire screen moves from it’s position and get’s nudged to the right side of the screen (including the action bar). To get back to the first screen you can either slide the right side back into focus or you can click the G+ icon again.

  1. YouTube (as of 7/7/12)

YouTube slide out menu screenshot

You can go from the first screen to second screen using two methods. Either click the YouTube logo in the upper left, or you can use a swipe gesture to move it to the right. This is already different from the G+ app. Secondly, you can see that the action bar stays put (Unlike G+). Lastly, to get the original screen back it works just like G+.

#21 Best answer 1 of Navigation Drawer (Google+ vs. YouTube) (Score: 153)

Created: 2012-07-08 Last updated: 2013-08-27

Edit #3:

The Navigation Drawer pattern is officially described in the Android documentation!

enter image description here Check out the following links:

  • Design docs can be found here.
  • Developer docs can be found here.

Edit #2:

Roman Nurik (an Android design engineer at Google) has confirmed that the recommended behavior is to not move the Action Bar when opening the drawer (like the YouTube app). See this Google+ post.


Edit #1:

I answered this question a while ago, but I’m back to re-emphasize that Prixing has the best fly-out menu out there… by far. It’s absolutely beautiful, perfectly smooth, and it puts Facebook, Google+, and YouTube to shame. EverNote is pretty good too… but still not as perfect as Prixing. Check out this series of posts on how the flyout menu was implemented (from none other than the head developer at Prixing himself!).


Original Answer:

Adam Powell and Richard Fulcher talk about this at 49:47 - 52:50 in the Google I/O talk titled “Navigation in Android”.

To summarize their answer, as of the date of this posting the slide out navigation menu is not officially part of the Android application design standard. As you have probably discovered, there’s currently no native support for this feature, but there was talk about making this an addition to an upcoming revision of the support package.

With regards to the YouTube and G+ apps, it does seem odd that they behave differently. My best guess is that the reason the YouTube app fixes the position of the action bar is,

  1. One of the most important navigational options for users using the YouTube app is search, which is performed in the SearchView in the action bar. It would make sense to make the action bar static in this regard, since it would allow the user to always have the option to search for new videos.

  2. The G+ app uses a ViewPager to display its content, so making the pull out menu specific to the layout content (i.e. everything under the action bar) wouldn’t make much sense. Swiping is supposed to provide a means of navigating between pages, not a means of global navigation. This might be why they decided to do it differently in the G+ app than they did in the YouTube app.

    On another note, check out the Google Play app for another version of the “pull out menu” (when you are at the left most page, swipe left and a pull out, “half-page” menu will appear).

You’re right in that this isn’t very consistent behavior, but it doesn’t seem like there is a 100% consensus within the Android team on how this behavior should be implemented yet. I wouldn’t be surprised if in the future the apps are updated so that the navigation in both apps are identical (they seemed very keen on making navigation consistent across all Google-made apps in the talk).

#21 Best answer 2 of Navigation Drawer (Google+ vs. YouTube)(Score: 15)

Created: 2012-12-19 Last updated: 2020-06-20

Just recently I forked a current Github project called “RibbonMenu” and edited it to fit my needs:

https://github.com/jaredsburrows/RibbonMenu

What’s the Purpose

  • Ease of Access: Allow easy access to a menu that slides in and out
  • Ease of Implementation: Update the same screen using minimal amount of code
  • Independency: Does not require support libraries such as ActionBarSherlock
  • Customization: Easy to change colors and menus

What’s New

  • Changed the sliding animation to match Facebook and Google+ apps
  • Added standard ActionBar (you can chose to use ActionBarSherlock)
  • Used menuitem to open the Menu
  • Added ability to update ListView on main Activity
  • Added 2 ListViews to the Menu, similiar to Facebook and Google+ apps
  • Added a AutoCompleteTextView and a Button as well to show examples of implemenation
  • Added method to allow users to hit the ‘back button’ to hide the menu when it is open
  • Allows users to interact with background(main ListView) and the menu at the same time unlike the Facebook and Google+ apps!

ActionBar with Menu out

ActionBar with Menu out

ActionBar with Menu out and search selected

ActionBar with Menu out and search selected

See also original question in stackoverflow

#22: Android toolbar center title and custom font (Score: 387)

Created: 2014-10-23 Last updated: 2019-07-17

Tags: android, android-layout, android-toolbar, android-theme, android-styles

I’m trying to figure out the right way to use a custom font for the toolbar title, and center it in the toolbar (client requirement).

At the moment, i’m using the good old ActionBar, and I was setting the title to empty value, and using setCustomView to put my custom font TextView and center it using ActionBar.LayoutParams.

Is there a better way to do that? Using the new Toolbar as my ActionBar.

#22 Best answer 1 of Android toolbar center title and custom font (Score: 763)

Created: 2014-10-24 Last updated: 2014-11-14

To use a custom title in your Toolbar all you need to do is remember is that Toolbar is just a fancy ViewGroup so you can add a custom title like so:

<android.support.v7.widget.Toolbar
	android:id="@+id/toolbar_top"
	android:layout_height="wrap_content"
	android:layout_width="match_parent"
	android:minHeight="?attr/actionBarSize"
	android:background="@color/action_bar_bkgnd"
	app:theme="@style/ToolBarTheme" >


     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Toolbar Title"
        android:layout_gravity="center"
        android:id="@+id/toolbar_title" />


	</android.support.v7.widget.Toolbar>

This means that you can style the TextView however you would like because it’s just a regular TextView. So in your activity you can access the title like so:

Toolbar toolbarTop = (Toolbar) findViewById(R.id.toolbar_top);
TextView mTitle = (TextView) toolbarTop.findViewById(R.id.toolbar_title);

#22 Best answer 2 of Android toolbar center title and custom font(Score: 72)

Created: 2016-07-04 Last updated: 2017-05-24

This’s just to help to join all pieces using @MrEngineer13 answer with @Jonik and @Rick Sanchez comments with the right order to help to achieve title centered easly!!

The layout with TextAppearance.AppCompat.Widget.ActionBar.Title :

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay">

        <TextView
            android:id="@+id/toolbar_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"                      
            style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
            android:layout_gravity="center" />

    </android.support.v7.widget.Toolbar>

The way to achieve with the right order:

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);

    setSupportActionBar(toolbar);
    mTitle.setText(toolbar.getTitle());

    getSupportActionBar().setDisplayShowTitleEnabled(false);

Please don’t forget to upvote @MrEngineer13 answer !!!

Here is a sample project ToolbarCenterTitleSample

enter image description here

Hope to help somebody else ;)

See also original question in stackoverflow

#23: How to set space between listView Items in Android (Score: 378)

Created: 2011-02-13 Last updated: 2019-11-19

Tags: android, android-layout, android-listview

I tried to use marginBottom on the listView to make space between listView Item, but still the items are attached together.

Is it even possible? If yes, is there a specific way to do it?

My code is below

<LinearLayout
android:id="@+id/alarm_occurences"
android:layout_width="fill_parent" 
android:orientation="vertical"
android:layout_height="fill_parent"
android:background="#EEEEFF"
xmlns:android="http://schemas.android.com/apk/res/android">

<ListView
android:id="@+id/occurences"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>

My custom List item:

<com.android.alarm.listItems.AlarmListItem
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" 
android:background="@drawable/alarm_item_background"
android:layout_marginBottom="10dp"    
>
<CheckedTextView     
	android:id="@android:id/text1"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"
	android:gravity="center_vertical"
	android:checkMark="?android:attr/listChoiceIndicatorMultiple"
	android:textSize="20sp"
	android:textStyle="bold"
	android:typeface="serif"
	android:padding="10dp"

/>

</com.android.alarm.listItems.AlarmListItem>

How can I make spacing between list items in this case?

#23 Best answer 1 of How to set space between listView Items in Android (Score: 849)

Created: 2011-03-15 Last updated: 2015-12-17

@Asahi pretty much hit the nail on the head, but I just wanted to add a bit of XML for anyone maybe floating in here later via google:

<ListView android:id="@+id/MyListView"
  android:layout_height="match_parent"
  android:layout_width="match_parent"
  android:divider="@android:color/transparent"
  android:dividerHeight="10.0sp"/>

For some reason, values such as “10”, “10.0”, and “10sp” all are rejected by Android for the dividerHeight value. It wants a floating point number and a unit, such as “10.0sp”. As @Goofyahead notes, you can also use display-independent pixels for this value (ie, “10dp”).

#23 Best answer 2 of How to set space between listView Items in Android(Score: 62)

Created: 2011-02-13 Last updated: 2014-09-29

Perhaps divider or dividerHeight property of the ListView can solve your problem.

See also original question in stackoverflow

#24: LinearLayout not expanding inside a ScrollView (Score: 377)

Created: 2010-04-08 Last updated: 2010-04-09

Tags: android, android-layout

I have a LinearLayout inside a ScrollView that has android:layout_height="fill_parent", but it doesn’t expand to the full height of the ScrollView. My layout looks something like:

level    layout    layout_width    layout_height
1    LinearLayout    fill_parent    fill_parent
2    LinearLayout    fill_parent    wrap_content
3    (some irrelevant stuff)
2    ScrollView      fill_parent    fill_parent <-- this expands full height
3    LinearLayout    fill_parent    fill_parent <-- this does not (has orientation=vertical)
(following stuff probably are irrelevant, but just to be sure:)
4    TextView        fill_parent    fill_parent
4    LinearLayout    fill_parent    wrap_content

I can see that the LinearLayout doesn’t expand the full height of the ScrollView because in Eclipse in Android Layout Editor, if I select the ScrollView (in the Outline panel) it is highlighted with a red border that fills the screen to the bottom but when I select the LinearLayout its highlight doesn’t expand to the bottom of the screen. How can I get it to do so?

The effect I’m trying to achieve is to have some text and a button below it (inside the LinearLayout in level 4 there’s just a button). The text can be big enough to need a scrollbar, in which case I want the user to have to scroll down in order to see the button. In case the text is not big enough for a scroll bar, I want the LinearLayout containing the button to stick to the bottom of the screen.

At first I thought I shouldn’t post the full XML because it’s usually a turn-down to see a huge chunk of code in a question. However, it seems it might be necessary, so here’s the full layout.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:orientation="vertical"
	xmlns:android="http://schemas.android.com/apk/res/android">
	<LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/video_layout"
        android:focusable="true"
        style="@style/VideoLayout">
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:foreground="@android:drawable/ic_media_play"
            android:foregroundGravity="center">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/video_thumb"
                android:padding="5dip"
                android:background="#454545"/>
        </FrameLayout>
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:focusable="true"
            style="@style/VideoTitle"
            android:id="@+id/video_title"
            android:layout_gravity="center"
            android:layout_weight="1"/>
	</LinearLayout>
	<ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
        <!-- this ScrollView expands the full height of the screen.
             However, the next LinearLayout does not expand the full height of the ScrollView -->
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:layout_gravity="fill"
            android:orientation="vertical"
            android:id="@+id/info_layout">
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/info_body"
                style="@style/InfoText"/>
            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                style="@android:style/ButtonBar">
                    <Button
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:layout_weight="1"
                        android:text="@string/button_readmore"
                        android:id="@+id/btn_read_more"/>
            </LinearLayout>
        </LinearLayout>
	</ScrollView>
</LinearLayout>

At the moment I have resorted to android:layout_gravity="bottom" on the problematic LinearLayout, which makes the button stick to the bottom of the screen no matter what. But that also makes the text stick to the bottom of the screen, which is not exactly what I was after.

Update: scratch that, android:layout_gravity="bottom" makes the ScrollView unable to, well, scroll. Other ideas?

#24 Best answer 1 of LinearLayout not expanding inside a ScrollView (Score: 978)

Created: 2010-04-09

Found the solution myself in the end. The problem was not with the LinearLayout, but with the ScrollView (seems weird, considering the fact that the ScrollView was expanding, while the LinearLayout wasn’t).

The solution was to use android:fillViewport="true" on the ScrollView.

#24 Best answer 2 of LinearLayout not expanding inside a ScrollView(Score: 24)

Created: 2015-09-14

I know this post is very old, For those who don’t want to use android:fillViewport="true" because it sometimes doesn’t bring up the edittext above keyboard. Use Relative layout instead of LinearLayout it solves the purpose.

See also original question in stackoverflow

#25: How to build a Horizontal ListView with RecyclerView? (Score: 368)

Created: 2015-02-11 Last updated: 2018-11-13

Tags: android, android-layout, android-recyclerview

I need to implement a horizontal listview in my Android application. I did a bit of research and came across https://stackoverflow.com/questions/3877040/how-can-i-make-a-horizontal-listview-in-android and https://stackoverflow.com/questions/3240331/horizontal-listview-in-android however, these questions were asked before Recyclerview was released. Is there a better way to implement this now with Recyclerview?

#25 Best answer 1 of How to build a Horizontal ListView with RecyclerView? (Score: 807)

Created: 2015-02-11 Last updated: 2015-09-05

Is there a better way to implement this now with Recyclerview now?

Yes.

When you use a RecyclerView, you need to specify a LayoutManager that is responsible for laying out each item in the view. The LinearLayoutManager allows you to specify an orientation, just like a normal LinearLayout would.

To create a horizontal list with RecyclerView, you might do something like this:

LinearLayoutManager layoutManager
    = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

RecyclerView myList = (RecyclerView) findViewById(R.id.my_recycler_view);
myList.setLayoutManager(layoutManager);

#25 Best answer 2 of How to build a Horizontal ListView with RecyclerView?(Score: 186)

Created: 2016-04-05 Last updated: 2016-04-15

 <android.support.v7.widget.RecyclerView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layoutManager="android.support.v7.widget.LinearLayoutManager" />

See also original question in stackoverflow

#26: How to set layout_gravity programmatically? (Score: 367)

Created: 2011-11-08 Last updated: 2016-05-18

Tags: android, android-layout

My question is simple,

How to set my buttons layout_gravity programmatically?

I found this on internet, but it simply throws me a Nullpointer exception:

 Button MyButton = new Button(this);
    
    LinearLayout.LayoutParams  lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
    lllp.gravity=Gravity.RIGHT;
    MyButton.setLayoutParams(lllp); 
    
    
    MyLinearLayout.addView(MyButton);

Any solution?

#26 Best answer 1 of How to set layout_gravity programmatically? (Score: 585)

Created: 2011-11-08 Last updated: 2019-06-29

Java

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.TOP;

button.setLayoutParams(params);

Kotlin

val params = LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT
).apply {
    weight = 1.0f
    gravity = Gravity.TOP
}

For gravity values and how to set gravity check Gravity.

Basically, you should choose the LayoutParams depending on the parent. It can be RelativeLayout, LinearLayout etc…

#26 Best answer 2 of How to set layout_gravity programmatically?(Score: 58)

Created: 2012-11-12 Last updated: 2016-06-17

I’d hate to be resurrecting old threads but this is a problem that is not answered correctly and moreover I’ve ran into this problem myself.

Here’s the long bit, if you’re only interested in the answer please scroll all the way down to the code:

android:gravity and android:layout_gravity works differently. Here’s an article I’ve read that helped me.

GIST of article: gravity affects view after height/width is assigned. So gravity centre will not affect a view that is done FILL_PARENT (think of it as auto margin). layout_gravity centre WILL affect view that is FILL_PARENT (think of it as auto pad).

Basically, android:layout_gravity CANNOT be access programmatically, only android:gravity. In the OP’s case and my case, the accepted answer does not place the button vertically centre.

To improve on Karthi’s answer:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
button.setLayoutParams(params);

Link to LinearLayout.LayoutParams.

android:layout_gravity shows “No related methods” meaning cannot be access programatically. Whereas gravity is a field in the class.

See also original question in stackoverflow

#27: What is the purpose of Android's <merge> tag in XML layouts? (Score: 360)

Created: 2012-01-12 Last updated: 2012-12-18

Tags: android, android-layout, include, code-reuse

I’ve read Romain Guy’s post on the <merge /> tag, but I still don’t understand how it’s useful. Is it a sort-of replacement of the <Frame /> tag, or is it used like so:

<merge xmlns:android="....">
<LinearLayout ...>
    .
    .
    .
</LinearLayout>
</merge>

then <include /> the code in another file?

#27 Best answer 1 of What is the purpose of Android's <merge> tag in XML layouts? (Score: 639)

Created: 2012-06-19 Last updated: 2019-09-05

<merge/> is useful because it can get rid of unneeded ViewGroups, i.e. layouts that are simply used to wrap other views and serve no purpose themselves.

For example, if you were to <include/> a layout from another file without using merge, the two files might look something like this:

layout1.xml:

<FrameLayout>
   <include layout="@layout/layout2"/>
</FrameLayout>

layout2.xml:

<FrameLayout>
   <TextView />
   <TextView />
</FrameLayout>

which is functionally equivalent to this single layout:

<FrameLayout>
   <FrameLayout>
      <TextView />
      <TextView />
   </FrameLayout>
</FrameLayout>

That FrameLayout in layout2.xml may not be useful. <merge/> helps get rid of it. Here’s what it looks like using merge (layout1.xml doesn’t change):

layout2.xml:

<merge>
   <TextView />
   <TextView />
</merge>

This is functionally equivalent to this layout:

<FrameLayout>
   <TextView />
   <TextView />
</FrameLayout>

but since you are using <include/> you can reuse the layout elsewhere. It doesn’t have to be used to replace only FrameLayouts - you can use it to replace any layout that isn’t adding something useful to the way your view looks/behaves.

#27 Best answer 2 of What is the purpose of Android's <merge> tag in XML layouts?(Score: 340)

Created: 2014-01-01 Last updated: 2014-03-18

The include tag

The <include> tag lets you to divide your layout into multiple files: it helps dealing with complex or overlong user interface.

Let’s suppose you split your complex layout using two include files as follows:

top_level_activity.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout1" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- First include file -->
    <include layout="@layout/include1.xml" />

    <!-- Second include file -->
    <include layout="@layout/include2.xml" />

</LinearLayout>

Then you need to write include1.xml and include2.xml.

Keep in mind that the xml from the include files is simply dumped in your top_level_activity layout at rendering time (pretty much like the #INCLUDE macro for C).

The include files are plain jane layout xml.

include1.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/textView1"
    android:text="First include"
    android:textAppearance="?android:attr/textAppearanceMedium"/>

… and include2.xml:

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/button1"
    android:text="Button" />

See? Nothing fancy. Note that you still have to declare the android namespace with xmlns:android="http://schemas.android.com/apk/res/android.

So the rendered version of top_level_activity.xml is:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout1" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- First include file -->
    <TextView
        android:id="@+id/textView1"
        android:text="First include"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

    <!-- Second include file -->
    <Button
        android:id="@+id/button1"
        android:text="Button" />


</LinearLayout>

In your java code, all this is transparent: findViewById(R.id.textView1) in your activity class returns the correct widget ( even if that widget was declared in a xml file different from the activity layout).

And the cherry on top: the visual editor handles the thing swimmingly. The top level layout is rendered with the xml included.

The plot thickens

As an include file is a classic layout xml file, it means that it must have one top element. So in case your file needs to include more than one widget, you would have to use a layout.

Let’s say that include1.xml has now two TextView: a layout has to be declared. Let’s choose a LinearLayout.

include1.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout2" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:text="Second include"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

    <TextView
        android:id="@+id/textView2"
        android:text="More text"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

</LinearLayout>

The top_level_activity.xml will be rendered as:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout1" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- First include file -->
    <LinearLayout 
        android:id="@+id/layout2" 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

       <TextView
            android:id="@+id/textView1"
            android:text="Second include"
            android:textAppearance="?android:attr/textAppearanceMedium"/>

       <TextView
            android:id="@+id/textView2"
            android:text="More text"
            android:textAppearance="?android:attr/textAppearanceMedium"/>
    
   </LinearLayout>

     <!-- Second include file -->
   <Button
        android:id="@+id/button1"
        android:text="Button" />

</LinearLayout>

But wait the two levels of LinearLayout are redundant!

Indeed, the two nested LinearLayout serve no purpose as the two TextView could be included under layout1for exactly the same rendering.

So what can we do?

Enter the merge tag

The <merge> tag is just a dummy tag that provides a top level element to deal with this kind of redundancy issues.

Now include1.xml becomes:

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:id="@+id/textView1"
        android:text="Second include"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

    <TextView
        android:id="@+id/textView2"
        android:text="More text"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

</merge>

and now top_level_activity.xml is rendered as:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout1" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- First include file --> 
    <TextView
        android:id="@+id/textView1"
        android:text="Second include"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

    <TextView
        android:id="@+id/textView2"
        android:text="More text"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

    <!-- Second include file -->
    <Button
        android:id="@+id/button1"
        android:text="Button" />

</LinearLayout>

You saved one hierarchy level, avoid one useless view: Romain Guy sleeps better already.

Aren’t you happier now?

See also original question in stackoverflow

#28: Calling setCompoundDrawables() doesn't display the Compound Drawable (Score: 347)

Created: 2011-07-06 Last updated: 2015-08-10

Tags: android, android-layout, android-drawable

After I call the setCompoundDrawables method, the compound Drawable is not shown..

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn.setCompoundDrawables(myDrawable, null, null, null);

Any thoughts?

#28 Best answer 1 of Calling setCompoundDrawables() doesn't display the Compound Drawable (Score: 662)

Created: 2011-07-06 Last updated: 2012-12-15

I needed to be using setCompoundDrawablesWithIntrinsicBounds.

#28 Best answer 2 of Calling setCompoundDrawables() doesn't display the Compound Drawable(Score: 73)

Created: 2014-10-19 Last updated: 2016-06-15

Use This (I tested). It works good

Drawable image = context.getResources().getDrawable( R.drawable.ic_action );
int h = image.getIntrinsicHeight(); 
int w = image.getIntrinsicWidth();   
image.setBounds( 0, 0, w, h );
button.setCompoundDrawables( image, null, null, null );

See also original question in stackoverflow

#29: Changing EditText bottom line color with appcompat v7 (Score: 317)

Created: 2014-10-26 Last updated: 2017-06-04

Tags: java, android, android-layout, android-edittext, android-styles

I am using appcompat v7 to get the look consistent on Android 5 and less. It works rather well. However I cannot figure out how to change the bottom line color and the accent color for EditTexts. Is it possible?

I have tried to define a custom android:editTextStyle (cf. below) but I only succeeded to change the full background color or text color but not the bottom line nor the accent color. Is there a specific property value to use? do I have to use a custom drawable image through the android:background property? is it not possible to specify a color in hexa?

 <style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
     <item name="android:editTextStyle">@style/Widget.App.EditText</item>
 </style>

 <style name="Widget.App.EditText" parent="Widget.AppCompat.EditText">
     ???
 </style>

According to android API 21 sources, EditTexts with material design seem to use colorControlActivated and colorControlNormal. Therefore, I have tried to override these properties in the previous style definition but it has no effect. Probably appcompat does not use it. Unfortunately, I cannot find the sources for the last version of appcompat with material design.

#29 Best answer 1 of Changing EditText bottom line color with appcompat v7 (Score: 485)

Created: 2014-10-29 Last updated: 2015-06-20

Finally, I have found a solution. It simply consists of overriding the value for colorControlActivated, colorControlHighlight and colorControlNormal in your app theme definition and not your edittext style. Then, think to use this theme for whatever activity you desire. Below is an example:

<style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorControlNormal">#c5c5c5</item>
    <item name="colorControlActivated">@color/accent</item>
    <item name="colorControlHighlight">@color/accent</item>
</style>

#29 Best answer 2 of Changing EditText bottom line color with appcompat v7(Score: 189)

Created: 2015-02-10 Last updated: 2020-03-10

I felt like this needed an answer in case somebody wanted to change just a single edittext. I do it like this:

editText.getBackground().mutate().setColorFilter(ContextCompat.getColor(context, R.color.your_color), PorterDuff.Mode.SRC_ATOP);

See also original question in stackoverflow

#30: RecyclerView inside ScrollView is not working (Score: 305)

Created: 2014-11-22 Last updated: 2016-05-20

Tags: android, android-layout, android-scrollview, android-recyclerview, android-cardview

I’m trying to implement a layout which contains RecyclerView and ScrollView at the same layout.

Layout template:

<RelativeLayout>
    <ScrollView android:id="@+id/myScrollView">
       <unrelated data>...</unrealated data>

           <android.support.v7.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/my_recycler_view"
            />
    </ScrollView>


</RelativeLayout>

Problems: i can scroll until the last element of ScrollView

Things i tried:

  1. card view inside the ScrollView (now ScrollView contains RecyclerView) - can see the card up until the RecyclerView
  2. initial thought was to implement this viewGroup using RecyclerView instead of ScrollView where one of it’s views type is the CardView but i got the exact same results as with the ScrollView

#30 Best answer 1 of RecyclerView inside ScrollView is not working (Score: 725)

Created: 2016-05-20 Last updated: 2020-06-20

use NestedScrollView instead of ScrollView

Please go through NestedScrollView reference document for more information.

and add recyclerView.setNestedScrollingEnabled(false); to your RecyclerView

#30 Best answer 2 of RecyclerView inside ScrollView is not working(Score: 107)

Created: 2016-08-17 Last updated: 2018-07-14

I know I am late it the game, but the issue still exists even after google has made fix on the android.support.v7.widget.RecyclerView

The issue I get now is RecyclerView with layout_height=wrap_content not taking height of all the items issue inside ScrollView that only happens on Marshmallow and Nougat+ (API 23, 24, 25) versions.
(UPDATE: Replacing ScrollView with android.support.v4.widget.NestedScrollView works on all versions. I somehow missed testing accepted solution. Added this in my github project as demo.)

After trying different things, I have found workaround that fixes this issue.

Here is my layout structure in a nutshell:

<ScrollView>
  <LinearLayout> (vertical - this is the only child of scrollview)
     <SomeViews>
     <RecyclerView> (layout_height=wrap_content)
     <SomeOtherViews>

The workaround is the wrap the RecyclerView with RelativeLayout. Don’t ask me how I found this workaround!!! ¯\_(ツ)_/¯

<RelativeLayout
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:descendantFocusability="blocksDescendants">

	<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>

Complete example is available on GitHub project - https://github.com/amardeshbd/android-recycler-view-wrap-content

Here is a demo screencast showing the fix in action:

Screencast

See also original question in stackoverflow


Notes:
  1. This page use API to get the relevant data from stackoverflow community.
  2. Content license on this page is CC BY-SA 3.0.
  3. score = up votes - down votes.