setContentView和EditText

时间:2011-12-09 15:42:49

标签: android

我有两个布局xml,无法让第二个布局正常工作。 放置在第二个布局上的EditText无法按预期工作。它不接受字符。

我在这里缺少什么? 我应该使用startActivity()吗?

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 个答案:

答案 0 :(得分:1)

我认为你不能以这种方式加载新的布局。

只需将两个EditTexts放在一个XML中,然后将一个可见,另一个隐身,再按一个按钮,反之亦然。

答案 1 :(得分:1)

使用具有与此类似结构的元布局xml文件:

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>

然后是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();
        }
    }
}

希望它有所帮助;)

答案 2 :(得分:0)

作为不同活动的替代方案,您可能需要查看ViewFlipper http://developer.android.com/reference/android/widget/ViewFlipper.html

答案 3 :(得分:0)

您只能在活动中调用一次setContentView()。

你可以

  1. 创建一个仅包含父I.E.的“主”布局。 LinearLayout或相对布局 父级上的setContentView()。然后使用findViewById()获取对它的引用,并在引用上调用.addView(),从这两个文件中的一个传递膨胀的xml。 .removeView()允许你在你喜欢时切换到另一个。
    1. 在一个xml布局中包含所有视图,但将其中一半视为Visibility.GONE,当您想要切换时,只需使GONE可见,反之亦然

答案 4 :(得分:0)

我认为它应该有用,你必须reinitialize references for example every findViewById needs to be called again after calling setContentView()。你正是这样做的,首先你要调用showXml1()&amp;然后你点击正在执行Case1的button1,你得到box1&amp;的价值显示它&amp;然后你打电话给showXml2()&amp;等等。我试过你的代码&amp;它有效,我正在伤害为什么它不适合你?

另一件事是it may not be a good idea if you have to call findViewbyId() a LOT OF TIMES,所以你应该避免它。