Java 安卓:如何改变点击按钮的布局?

Java 安卓:如何改变点击按钮的布局?,java,android,android-intent,android-activity,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.mai

我必须按照下面的代码选择按钮点击布局

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”按钮时,什么也没有发生

说我必须开始一项新的活动

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

编辑: 我有新活动的代码:

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说:

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

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

    }
}
然后我会检查布局是否确实不同

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

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

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

NB:检查此项。

我认为您要做的事情应该通过多项活动来完成。如果你正在学习Android,那么理解活动是你必须解决的问题。试图用一个活动编写一个完整的应用程序将变得更加困难。阅读本书,让自己开始,然后你应该得到更多类似的东西:

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

我知道我来的这么晚,但管它呢

我已经得到了与Kris几乎完全相同的代码,只使用了一个活动,但有两个不同的布局/视图,我想在布局之间随意切换

作为测试,我添加了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);
        }
    }

注意,我有一个活动课。这很好用。所以我不知道为什么人们建议使用不同的活动/意图。也许有人可以解释为什么我的代码有效而克里斯的代码无效。

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

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

所以在布局上

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

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


这很简单,只需执行以下操作:

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

        }

    });

谢谢你的回复,我写了一个日志,代码被调用了,是的,布局不同。检查两个布局中的按钮id。第一个布局中的按钮id与第二个布局中的按钮id相同吗?否,只要它在每个布局文件中只出现一次就可以了。是的,它在我的每个布局文件中只出现一次。@克里斯:请看我的编辑,我认为第二个布局中的按钮应该具有相同的标识,因为当您更改布局时,按钮仅在第一个布局中!!!好的,如果你需要一个新的活动,那么再看看我的编辑:你可以使用意图来做这件事,很简单,嗨,Houcine,谢谢,我就在附近!我编辑了这个问题,我得到了一个强制关闭错误。更新后的问题有新活动的代码和logcat所说的内容,请参见我的编辑:),我想你忘记了super.onCreate();哇,这很有魅力,非常适合我要找的东西!非常感谢Houcine!:)您还可以将安卓:onClick添加到按钮中
@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //... your code
}
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

        }

    });