I been round and round on this, and I can not seem to get the text in the ListView to center.
The ListView itself centers good, but text inside is not.. I hate to ask seems so basic..
Here is Code I have:
<ListView
android:id="#+id/lvVoiceReturn"
android:layout_width="200dp"
android:layout_height="48dp"
android:layout_above="#+id/mute"
android:layout_toLeftOf="#+id/mute"
android:gravity="center" >
</ListView>
Im sure its an easy line of code but i have not located it, urgh.. =/
Thank you.
Droidster
It is because you have used android:gravity="center"
This doesn't center the textview, but centers the text inside of the text view.
What you want to use is
android:layout_centerInParent="true"
If you were using a linear layout, then you could use
android:layout_gravity="center"
This is where you got confused, in a relative layout you can't use this because it will give you a syntax error.
If you are using a custom adapter with a custom element layout file then please post the xml here. setting gravity attribute to center for list view does not ensure that your list items are gonna center align.
Related
the xml file:
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="#+id/singleProp"
android:scrollbarAlwaysDrawVerticalTrack="true"
android:visibility="gone">
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:id="#+id/propertyImg"/>
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/propertyData"
android:layout_below="#id/propertyImg">
</ListView>
</RelativeLayout>
With the above codes, the image will be fixed at top-center position. With CSS terms in html, the style of that image view is style="position:fixed" but what I want is style="position:relative".
For example,
I hope the picture can illustrate the idea.
May I know how I should modify my codes?
Let me elaborate a bit more on mark.zhai`s answer, since it's the only one that I find to be the proper approach.
First of all I wanna point out that you should think about implementing your list with a RecyclerView instead of ListView (right now it's generally favoured to use a RecyclerView; ListView is getting kinda deprecated)...
If you want to be sure that your ImageView works nicely (scroll-wise) with your list (without too much "side-work" on scroll integration), you should implement it as a first item of your list. If you stick with your ListView you can use the header function of it and add your ImageView with ListView's method addHeaderView. If you decide to move to a RecyclerView (which I think you should), you can accomplish that in a bit more difficult manner (more on that for example here).
why don't u make the imageview an item of the listview
For this you need to create a custom listview which having the first item as a image view and later having all your list items. Probably you can control this in your adapter getview method by the use of position(int)
For example if Position is equal to '0' show only image view and if position is not equal to '0' show your rest elements by using Visibility
Note: here their might be a chance of performance issues as it is loading the unnecessary views every time
To achieve this, you need to scrolling the complete layout. In general case, when you fling on a list view, only the item within the list view moves.
Check this link.
I'm not entirely sure what you're asking, as I don't know a lot about CSS, but you can check out this link which describes aligning elements within a Relative Layout.
You might want to try adding alignParentLeft or alignParentRight.
Remember margins are external to the object and padding is internal. For example to move the image 20dp from the left you would:
<ImageView
android:layout_alignParentLeft="true"
android:layout_marginLeft="20dp"
android:layout_width="200dp"
android:layout_height="200dp"
android:id="#+id/propertyImg"/>
Here are some useful links about mastering Relative Layouts:
Relative Layout Params
Moving Elements Around in a Relative Layout Tutorial
Another RelativeLayout Example
Margins and Padding
Why don't you use layout_below to take your layout below whatever you want, and use layout_gravity to set it's gravity. You can check these Link to get you better understand, it will help you in these problem.
This may seem like a duplicate but I can't find an answer anywhere.
It seems everyone has "TextView" available to edit in their activity xml file, whereas I only have the following:
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="#+id/liv1"
android:layout_below="#+id/lt1"
android:layout_marginTop="29dp"
android:layout_alignRight="#+id/lt1"
android:layout_alignEnd="#+id/lt1"
android:layout_alignLeft="#+id/lt1"
android:layout_alignStart="#+id/lt1"
/>
Using android:gravity = centerdoes nothing when I put it in between the "ListView" brackets.
So what is it I should do?
You should create a custom ListView adapter that fits your needs, and also create an inflater's xml layout and align the text there whatever you want.
More info here:
Custom Adapter for List View
http://www.androidinterview.com/android-custom-listview-with-image-and-text-using-arrayadapter/
You should set gravity in your item, that you using in your adapter. And there modify your textView like this way:
<TextView
android:id="#+id/textView"
android:layout_width="match_parent" <= set this
android:layout_height="wrap_content"
android:text="#string/invalid"
android:gravity="center" <=this your gravity
/>
As you can see the picture below that when there is no item in the list it shows nice icon in the middle of the screen with a text. I can get only a text shown if the listview is empty with this code in my custom layout :
<TextView android:id="#android:id/empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FF0000"
android:text="No data"/>
adding this element in my layout show a text when the list is empty. I would like to show an icon instead and also it should be in the middle of the screen. Instead of a textview if I use a imageView again it goes top of the screen. what is the best approach to this? I might be able to get it as I like using imageview and textview and both with android:id="#android:id/empty attribute. or is that possbile to have layout with the android:id="#android:id/empty attribute and place imageview and textview inside?
Sure, just use a layout. LinearLayout might work well in this case. You'll probably have to set the gravity to center. It seems you already had the right idea, I'm not sure why you didn't just try it out? You would have had it!
I would like to place a layout on the bottom of a LinearLayout, but I can't seem to get it to work. I know that I can use RelativeLayout to do this, but I should be able to use LinearLayout, shouldn't I?
EDIT: Actually this is more confusing than I thought. The layout below is simplified. In reality, I'm using fragments on a pre-3.0 device, with the compatibility layer.
I used Hierarchy Viewer to examine what's going on, and found that an android.support.v4.app.NoSaveStateFrameLayout was added to my layout, and that layout has layout_height set to wrap_content. That seems to be what's causing my problem, but I haven't yet figured out how to fix it.
Specifically, why doesn't this work? Shouldn't the layout_gravity place it at the bottom?
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
... stuff here ...
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:orientation="horizontal">
... more stuff here ...
</LinearLayout>
</LinearLayout>
BTW, changing layout_height to fill_parent or setting layout_weight don't seem to work either. I just want to better understand what is going on, because clearly I'm missing something important. Thanks.
First of all nice question.
Android behaves we can say weird in the situation like this.
if you have selected your parent linear layout's orientation horizontal then you can set its child component at bottom by setting its layoug_gravity=bottom. suppose you have added 2 text views in that horizontal linear layout and second textview's layout_gravity is bottom then it will set to bottom but it work like it is set at bottom in other column then the first text view. NOTE : you can set textview's layout_gravity = "left" or "right" when its parent linearlayout is horizontal but you cant see its result.
Oppositely, if you have selected parent linearlayout's orientation vertical then you can set its child component at left or right by using layout_gravity. but the second textview will shown in you can say next row with left or right gravity as you have set. NOTE you can set textview's layout_gravity = "top" or "bottom" when its linear layout is vertical but you can not see its result.
Try to make sample xml design as i have stated above so you get better idea.
Strange but True!!! Try to understand this behavior. :)
Just add space between what you want at the bottom and all the rest:
<Space
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
So I resolved the problem. It's a two-part solution:
First, the way to do this without using LinearLayout is to provide weight to the element above so that it takes up all of the empty space. BTW, you can see this example in the API demos: http://developer.android.com/resources/samples/ApiDemos/res/layout/linear_layout_3.html
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
... stuff here ...
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:weight="1"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
... more stuff here ...
</LinearLayout>
</LinearLayout>
This by itself didn't solve my problem, as I had a NoSaveStateFrameLayout with layout_width="wrap_content" as a parent view, and so I needed to get that fixed first. I'm using code based on the wonderful Google I/O App, and when I searched the code for NoSaveStateFrameLayout, I found this:
// For some reason, if we omit this, NoSaveStateFrameLayout thinks we are
// FILL_PARENT / WRAP_CONTENT, making the progress bar stick to the top of the activity.
mRootView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT));
Thanks for an awesome comment Google!!! I added this into my source and everything worked great!
The moral of the story: Hierarchy Viewer and comments are your friends.
LinearLayout will just stack things as they are placed in there. Since it is vertical, it will keep placing items one after the next in a vertical manner. Can you change the android:gravity of the linearLayout and not the layout_gravity of the nested one and see if that works.
RelativeLayout of course should be the first way but you stated you didnt want to do that. Is there reason for that?
It could be that, as per https://stackoverflow.com/a/13366783/513038, you need to set the parent LinearLayout to have android:baselineAligned="false". Worked in my case.
I have just started learning Android and thought of a simple project to help me learn.
I have created a simple menu using a ListView on a LinearLayout.
What I want to do is center the text in the ListView and also center the ListView in the layout.
I tried setting gravity to center-Hozitonal but that didn't work.
You can set the gravity (not layout_gravity) attribute to center text. Make sure that you also set layout_width is set to "fill_parent". For example, in my_text_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"/>
And then you can use R.id.my_text_view as your resource id.