Yevgeny Simkin
Yevgeny Simkin

Reputation: 28379

correct way to display EditText

I'm confused and frustrated that I can't get my EditText field to take up a rational amount of space in the layout without explicitly telling it how many pixels to be.

I'm *sure I'm missing something obvious, but my experience is that EditText totally ignores layout_weight and either grows/shrinks dynamically with the text that is entered into it if I give it a layout_weight of "wrap_content" or takes up most of the space in its parent layout if I give it a weight of fill_parent.

So... what is the correct path to having an EditText field that occupies some portion of its parent layout (in my case Linear, but I'm flexible) so that it can have a label next to it and look like:

Name: [ EDIT TEXT HERE   ]
Phone:[ EDIT TEXT HERE   ]

etc.

TIA

Upvotes: 0

Views: 1515

Answers (4)

Squonk
Squonk

Reputation: 48871

For each line use a horizontal LinearLayout.

Inside that, add a horizontal LinearLayout to 'wrap' the TextView. Give that LinearLayout a layout_weight of 20 (for example).

Use another horizontal LinearLayout to 'wrap' the EditText and set the EditText to fill_parent but give its outer LinearLayout a layout_weight of 80 (or whatever value based on 20+80 = 100% if you see what I mean).

EDIT: Also if you need to have multiple lines then to simplify the overall layout file, you can define a 'single line' layout file and use it as a custom layout entry.

Upvotes: 1

Krylez
Krylez

Reputation: 17820

You can do a couple different things. As mentioned, you should be using dp instead of pixels for layout. Using dp allows your views to scale by the screen's physical size rather than resolution.

Here's an example of specifying the edit boxes to appear to the right of each label and take up the remainder of a the screen:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/name_label"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:text="Name:" />
    <TextView
        android:id="@+id/phone_label"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_below="@id/name_label"
        android:text="Phone:" />
    <EditText
        android:id="@+id/name_text"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_toRightOf="@id/name_label" />
    <EditText
        android:id="@+id/phone_text"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_toRightOf="@id/phone_label"
        android:layout_below="@id/name_text" />

</RelativeLayout>

Here's an example of a LinearLayout where weight is used:

<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="match_parent"
        android:layout_height="50dp" 
        android:orientation="horizontal"> 
        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent" 
            android:text="Name:" 
            android:layout_weight="1"/>
        <EditText
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="5"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp" 
        android:orientation="horizontal"> 
        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent" 
            android:text="Phone:" 
            android:layout_weight="1"/>
        <EditText
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="5"/>
    </LinearLayout>

</LinearLayout>

Note that the LinearLayout has 7 views while the RelativeLayout accomplishes something similar with 5 views. LinearLayouts hare handy, but they're more complex. As your layouts get more complicated, they will perform worse than RelativeLayouts, especially when you nest them.

Upvotes: 2

craigmj
craigmj

Reputation: 5077

You need to work with the Layout. LinearLayout is not the right Layout for your purposes. Have a look at TableLayout, which I think might fulfill your requirements. Have a look at the TableLayout tutorial.

Upvotes: 0

Padma Kumar
Padma Kumar

Reputation: 20041

//for your edittext set min width and max length

android:minWidth="40"
android:maxLength="30"
android:layout_width="wrap_content"

so that it will be always shows minimum width and your characters wont exceed more than 30.

Upvotes: 0

Related Questions