从一个布局视图切换到另一个并返回?

3
我想制作一个Android应用程序,它从一个名为main的布局开始,并且当你按下这个布局中的一个名为stateButton的按钮时,该布局会更改为包含另一个按钮(名为boton2 )的main2布局。当您按下此按钮时,将返回到第一个主布局。

我希望在同一个activity中完成此操作,而不需要创建或启动另一个activity。

这里是代码的一部分:

public class NuevoshActivity extends Activity
implements SensorEventListener, OnClickListener {
    private Button stateButton;
    private Button boton2;

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);       
        setContentView(R.layout.main); 
        this.stateButton = (Button) this.findViewById(R.id.boton);
        this.boton2 = (Button) this.findViewById(R.id.boton2);      
        stateButton.setOnClickListener(this);
        boton2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v==stateButton) {
            setContentView(R.layout.main2);             
        }
        else if(v==boton2) {
            setContentView(R.layout.main);
        }
    }
}

这些主要包含一些图片、文本视图和按钮。

但我遇到了一些麻烦。它难道不可以就这么简单吗?或者我漏掉了什么,或者是哪里有问题吗?

4个回答

4
当你使用findViewById时,实际上是在尝试在通过setContentView指定的布局中查找视图。因此,反复使用setContentView可能会在您尝试检查按钮时带来问题。
而不是使用setContentView,我会将屏幕的两个布局作为子项添加到一个ViewFlipper中,该ViewFlipper一次只显示一个子项,并且您可以指定要显示的子项的索引。使用ViewFlipper的好处是,如果需要在视图之间切换时添加“进入”和“退出”动画,您可以轻松地指定视图的动画效果。这比反复调用setContentView的方法更加简洁。

2
FrameLayout非常好地处理了这个问题... 使用<include...结构加载多个其他布局,然后您可以通过在各个布局上使用setvisibility(View.VISIBLE);setVisibility(View.INVISIBLE);来在它们之间切换。

例如:

主XML包括另外两个布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/frameLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
    <include android:id="@+id/buildinvoice_step1_layout" layout="@layout/buildinvoice_step1" android:layout_width="fill_parent" android:layout_height="fill_parent"></include>
    <include android:id="@+id/buildinvoice_step2_layout" android:layout_width="fill_parent" layout="@layout/buildinvoice_step2" android:layout_height="fill_parent"></include>
</FrameLayout>

切换布局的代码:

findViewById(R.id.buildinvoice_step1_layout).setVisibility(View.VISIBLE);
findViewById(R.id.buildinvoice_step2_layout).setVisibility(View.INVISIBLE);

你还需要在activity启动时(或在XML中)设置各个布局的可见性,否则你将看到它们两个 - 一个叠在另一个上面。

1

你的boton2按钮将会是NULL,因为该按钮的定义在main2.xml中。 你能找到的唯一视图是在main.xml中定义的视图。


0

谢谢!!! 所有信息都很有用,让我理解了很多事情。正如C0deAttack所评论的那样,我在main2上的按钮上遇到了麻烦。我的做法是在每个布局中设置View.VISIBLE和View.GONE来控制所需的TextView和Button。非常感谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接