如何通过Android中的按钮切换视图

时间:2014-01-27 03:17:56

标签: java android xml

我是android编程的新手,我正在尝试创建一个简单的按钮,只需点击一下按钮就可以将视图从activity_main_menu.xml切换到info_menu.xml。这里分别是源代码和XML。

MainMenu.java

package us.wi.k12.cadottschools;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainMenu extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_menu);

        final Button infoButton = (Button) findViewById(R.id.InfoButton);

        infoButton.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v)
                    {
                        setContentView(R.layout.info_menu);
                    };
                });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }
}

avtivity_main_menu.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:orientation="vertical"
    android:gravity="center" >
<Button android:id="@+id/CalendarButton"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:text="@string/calendar_button" />
<Button android:id="@+id/InfoButton"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:text="@string/info_button" />
<Button android:id="@+id/ContactButton"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:text="@string/contact_button" />
</LinearLayout>

两次运行时都没有抛出任何错误,但是当我点击InfoButton按钮时,没有任何反应。

6 个答案:

答案 0 :(得分:1)

虽然可以多次调用setcontentView(),但不建议这样做。

开始新活动或使用ViewFlipper或ViewSwitcher是更好的解决方案。

顺便说一句,如果再次调用setcontentview(),则使用find将所有对象再次view.findviewbyid()

答案 1 :(得分:1)

将评论转换为答案

; }之后您还需要额外onClick()。所以看起来应该是

        infoButton.setOnClickListener(
        new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                setContentView(R.layout.info_menu);
            }  // sholdn't be one here since its closing a method
        });

在一个setContentView()中多次调用Activity通常不是一种好习惯。这会导致问题,因为原始View中的任何layout都是null。最好在Activity内开始新的Fragment(或使用onClick() s)。然后在新的Activity中,在layout info_menu.xml setContentView()的{​​{1}}内设置Activity此处onClick()

那么你的 infoButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(v.getContext(), NextActivityName.class); startActivity(i); } }); 就像是

{{1}}

Intent Docs

Activity Docs

答案 2 :(得分:0)

如果您可以开始新的活动来交换视图,则此链接应该会有所帮助:http://developer.android.com/training/basics/firstapp/starting-activity.html

如果您尝试在不启动新活动的情况下交换视图,请将布局xml文件合并到一个文件中。然后在按下按钮之前将要设置的视图的可见性设置为View.VISIBLE,并在按钮按下View.GONE之前设置您不希望看到的视图。然后,一旦按下按钮,将要查看的视图设置为View.VISIBLE,并将您不希望看到的视图设置为View.GONE。

如果您需要代码示例,请与我们联系!

答案 3 :(得分:0)

FragmentViewPager可能就是您想要的。您可以在其中使用FrameLayout和多*Layout,然后更改可见性(不会真正更改视图,但与用户没有区别)

答案 4 :(得分:0)

切换到新视图的推荐方法是启动新活动。但是,如果要通过单击按钮更改现有视图。您可以使用LayoutInflater。

参考 http://www.mysamplecode.com/2011/10/android-dynamic-layout-using-xml-add.html https://justanapplication.wordpress.com/tag/android-view-layoutinflater/

答案 5 :(得分:0)

您只能在Activity中设置一次。如果要切换视图,可以尝试片段:     公共类MainActivity扩展ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
    }

    private PlaceholderFragment extends Fragment() {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.info_menu, container, false);
            return v;
        }
    }
}