1

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> 

5 Answers 5

1

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 ;)

Sign up to request clarification or add additional context in comments.

Comments

1

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.

Comments

0

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

Comments

0

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

1 Comment

I'm not familiar with either solutions you presented. Thanks for the heads up.
0

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.