android:如何在按钮点击时更改布局?

时间:2011-05-25 08:50:08

标签: java android android-intent android-activity

我必须按下代码才能在按钮点击时选择布局。

View.OnClickListener handler = new View.OnClickListener(){
    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.DownloadView: 
                // doStuff
                setContentView(R.layout.main);
                break;
            case R.id.AppView: 
                // doStuff
                setContentView(R.layout.app);
                break;
        }
    }
};

findViewById(R.id.DownloadView).setOnClickListener(handler);
findViewById(R.id.AppView).setOnClickListener(handler);

当我点击“AppView”按钮时,布局会发生变化,但是当我点击“DownloadView”按钮时,没有任何反应。

This link说我必须开始一项新活动。

但我不知道如何使用意图启动新活动的代码,是否会添加新文件?

修改: 我有关于新活动的代码:

package com.example.engagiasync;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class AppView extends Activity implements OnClickListener{


    @Override
    public void onCreate(Bundle savedInstanceState){

        setContentView(R.layout.app);

        TextView tv = (TextView) this.findViewById(R.id.thetext);
        tv.setText("App View yo!?\n");
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }
}

但它不起作用,强制关闭,logcat说: enter image description here

8 个答案:

答案 0 :(得分:20)

  Button btnDownload = (Button) findViewById(R.id.DownloadView);
  Button btnApp = (Button) findViewById(R.id.AppView);

  btnDownload.setOnClickListener(handler);
  btnApp.setOnClickListener(handler);

  View.OnClickListener handler = new View.OnClickListener(){

  public void onClick(View v) {

    if(v==btnDownload){ 
            // doStuff
            Intent intentMain = new Intent(CurrentActivity.this , 
                                           SecondActivity.class);
            CurrentActivity.this.startActivity(intentMain);
            Log.i("Content "," Main layout ");
    }

    if(v==btnApp){ 
            // doStuff
            Intent intentApp = new Intent(CurrentActivity.this, 
                                          ThirdActivity.class);

            CurrentActivity.this.startActivity(intentApp);

            Log.i("Content "," App layout ");

    }
   }
  };

注意:然后您应该在清单.xml文件中声明所有活动,如下所示:

<activity android:name=".SecondActivity" ></activity>
<activity android:name=".ThirdActivity" ></activity>

编辑:更新代码的这一部分:):

@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);// Add THIS LINE

    setContentView(R.layout.app);

    TextView tv = (TextView) this.findViewById(R.id.thetext);
    tv.setText("App View yo!?\n");
}

注意:检查此(Broken link) Tutorial About How To Switch Between Activities

答案 1 :(得分:10)

我会在布局中添加android:onClick,然后更改活动中的布局。

所以在布局中

<ImageView
(Other things like source etc.)
android:onClick="changelayout"
/>

然后在活动中添加以下内容:

public void changelayout(View view){
    setContentView(R.layout.second_layout);
}

答案 2 :(得分:2)

我认为你要做的事情应该是多项活动。如果您正在学习Android,那么理解活动是您必须要解决的问题。尝试用一个Activity编写一个完整的应用程序最终会变得更加困难。阅读this article让自己开始,然后你应该得到更像这样的东西:

View.OnClickListener handler = new View.OnClickListener(){
    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.DownloadView: 
                // doStuff
                startActivity(new Intent(ThisActivity.this, DownloadActivity.class));
                break;
            case R.id.AppView: 
                // doStuff
                startActivity(new Intent(ThisActivity.this, AppActivity.class));
                break;
        }
    }
};

findViewById(R.id.DownloadView).setOnClickListener(handler);
findViewById(R.id.AppView).setOnClickListener(handler);

答案 3 :(得分:2)

我知道我迟到了,但到底是什么。

我几乎和Kris完全相同的代码,只使用一个Activity但有两个不同的布局/视图,我想随意切换布局。

作为测试,我添加了2个菜单选项,每个选项都会切换视图:

public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.item1:
                setContentView(R.layout.main);
                return true;
            case R.id.item2:
                setContentView(R.layout.alternate);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

注意,我有一个Activity类。这非常有效。所以我不知道为什么人们建议使用不同的活动/意图。也许有人可以解释为什么我的代码有效并且Kris没有。

答案 4 :(得分:2)

您想在按钮单击时在运行时更改布局。但这是不可能的,正如上面所说,你需要重新启动活动。当您计划根据用户的选择更改主题时,您会遇到类似的问题,但它不会在运行时反映出来。您必须重新开始活动。

答案 5 :(得分:1)

logcat显示错误,您应该调用super.onCreate(savedInstanceState)

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //... your code
}

答案 6 :(得分:0)

首先,我建议在您的交换机的每个案例中放入一个日志,以确保您的代码被调用。

然后我会检查布局实际上是不同的。

答案 7 :(得分:0)

这很简单,只需这样做:

t4.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {

            launchQuiz2();          // TODO Auto-generated method stub

        }

        private void launchQuiz2() {
            Intent i = new Intent(MainActivity.this, Quiz2.class);
            startActivity(i);
            // TODO Auto-generated method stub

        }

    });