joaogoncalv_es
joaogoncalv_es

Reputation: 309

setContentView and EditText

I have two layouts xml and can't get the second layout to work correctly. A EditText placed on the second layout doesn't work as expected. It doesn't accept characters.

What am i missing here? Should i use startActivity() instead?

Main.java

public class Main extends Activity implements View.OnClickListener {

    EditText box1, box2;

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        showXml1();
    }

    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1:
            String box11 = box1.getText().toString();
            Toast.makeText(this, box11,Toast.LENGTH_SHORT).show();
            showXml2();
            break;
        case R.id.button2:
            String box22 = box2.getText().toString();
            Toast.makeText(this, box22,Toast.LENGTH_SHORT).show();
            showXml1();
            break;
        }
    }

    public void showXml2() {
        setContentView(R.layout.main2);
        box2 = (EditText) findViewById(R.id.editText2);
    }
    public void showXml1() {
        setContentView(R.layout.main);
        box1 = (EditText) findViewById(R.id.editText1);
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Main1" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button1" 
        android:onClick="onClick"
        />

</LinearLayout>

mail2.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Main2" />

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button2" 
        android:onClick="onClick"
        />
</LinearLayout>

Upvotes: 1

Views: 1152

Answers (5)

pablisco
pablisco

Reputation: 14237

Use a meta layout xml file with a structure similar to this one:

meta_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<ViewFlipper
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
      android:id="@+id/root">
    <include
      layout="@layout/main" />
    <include
       layout="@layout/main2" />
</ViewFlipper>

And then main.java:

public class Main extends Activity implements View.OnClickListener {

    EditText box1, box2;
    ViewFlipper root;

    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.meta_main);
        box1 = (EditText) findViewById(R.id.editText1);
        box2 = (EditText) findViewById(R.id.editText2);
        root = (ViewFlipper) findViewById(R.id.root);
    }

    public void onClick(View v) {
        EditText editText = null;
        switch (v.getId()) {
            case R.id.button1:
                editText = box1;
                root.showNext();
            break;
            case R.id.button2:
                editText = box2;
                root.showPrevious();
            break;
        }
        if(editText != null) {
            Toast.makeText(this, editText.getText(), Toast.LENGTH_SHORT).show();
        }
    }
}

Hope it helps ;)

Upvotes: 1

Yaqub Ahmad
Yaqub Ahmad

Reputation: 27659

I think it should work, you have to reinitialize references for example every findViewById needs to be called again after calling setContentView(). You are exactly doing so first you are calling showXml1() & then you are clicking button1 which is executing Case1, you are getting the value of box1 & displaying it & then you are calling showXml2() & so on. I have tried your code & it works, i am wounding why its not working on your side?

Another thing is that it may not be a good idea if you have to call findViewbyId() a LOT OF TIMES, so you should avoid it i guess.

Upvotes: 0

FoamyGuy
FoamyGuy

Reputation: 46856

You are only allowed to call setContentView() once in your activity.

You can either

  1. Create a "Main" layout that just contains a parent I.E. LinearLayout, or Relative layout setContentView() on the parent. Then acquire a reference to it with findViewById() and call .addView() on your reference passing the inflated xml from one of these two files. .removeView() will allow you to switch to the other one when you like.

or

  1. Include all of your views in one xml layout, but make half of them Visibility.GONE and when you want to switch just make the ones that were GONE be VISIBLE and vice versa

Upvotes: 0

Dante
Dante

Reputation: 1094

I don't think you can load a new layout that way.

Just put the two EditTexts in one XML and put one visible and the other invisble and with a button click vice versa.

Upvotes: 1

nwaltham
nwaltham

Reputation: 2084

As an alternative to different activities you might want to look at ViewFlipper http://developer.android.com/reference/android/widget/ViewFlipper.html

Upvotes: 0

Related Questions