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

25

我有以下的代码,用于在按钮点击时选择布局。

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”按钮时,什么也不会发生。

这个链接说我必须启动一个新的活动(activity)。

但我不知道如何使用那里的意图(intent)代码来启动新的活动,是否需要添加一个新文件?

编辑: 我的代码在新的活动中:

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


请在布局文件和代码中检查您的按钮ID。 - Sujit
当第一个布局中的按钮ID与第二个布局相同时,是否被禁止? - Kris
不,只要每个布局文件中只出现一次,那就没问题。 - Flo
是的,它只在我的每个布局文件中出现一次。 - Kris
8个回答

23
  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>

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

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

NB : 请查看此教程,了解如何在Android中切换活动(链接已失效)。


@Kris:请看我的编辑,我认为你应该在第二个布局中使用相同的按钮标识符来保持一致,因为当你更改布局时,按钮仅存在于第一个布局中。!!! - Houcine
如果你需要一个新的Activity,那么请看我的编辑:你可以使用Intent来实现,非常简单。 - Houcine
嗨Houcine,谢谢,我快了!我编辑了问题,我遇到了一个强制关闭的错误。更新后的问题包含新活动的代码以及logcat的内容。 - Kris
1
嗨,Kris,看看我的编辑:)我认为你忘记了super.onCreate(); - Houcine

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

所以在布局中:

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

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

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

你也可以将android:onClick添加到按钮上。 - cnfw

2

我认为你想要做的应该使用多个Activity来实现。如果你正在学习Android,理解Activity是你必须要解决的问题。试图只用一个Activity编写整个应用程序最终会变得更加困难。阅读这篇文章可以帮助你入门,然后你应该能够得到类似于以下的结果:

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

2

我知道我来晚了,但是无所谓。

我有几乎与Kris完全相同的代码,只使用一个Activity但有两个不同的布局/视图,并且我想随意在这些布局之间切换。

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

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类,这个类工作得非常完美。所以我不知道为什么有人建议使用不同的Activities/Intents。也许有人可以解释一下为什么我的代码能够正常工作而Kris的代码不能。


2

你希望在按钮点击时动态更改布局,但这是不可能的,正如上面正确地说明的那样,你需要重新启动活动。当你计划根据用户的选择更改主题时,你将遇到类似的问题,但它不会在运行时反映出来。你需要重新启动活动。


1
日志显示错误,您应该调用 super.onCreate(savedInstanceState)
@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //... your code
}

1
非常简单,只需要这样做:

它很简单,只需这样做:

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

        }

    });

0
首先,我建议在您的switch的每个case中放置一个Log,以确保您的代码正在被调用。
然后,我会检查布局是否实际上是不同的。

谢谢您的回复,我添加了一个日志并且代码被调用了,是的,布局确实不同。 - Kris

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