【问题标题】:android: how to change layout on button click?android:如何更改按钮点击布局?
【发布时间】:2011-09-01 13:59:33
【问题描述】:

我必须遵循代码来选择按钮单击时的布局。

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

【问题讨论】:

  • 在两个布局中检查您的按钮 ID..
  • 第一种布局中的按钮id与第二种布局相同时是否禁止?
  • 不,应该没问题,只要它在每个布局文件中只出现一次即可。
  • 是的,它在我的每个布局文件中只出现一次。

标签: java android android-intent android-activity


【解决方案1】:

首先,我建议在您的开关的每种情况下都放置一个日志,以确保您的代码被调用。

然后我会检查布局是否真的不同。

【讨论】:

  • 感谢您的回复,我放了一个日志并调用了代码,是的,布局不同。
【解决方案2】:
  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。

【讨论】:

  • @Kris :看我的编辑,我认为你应该在第二个布局中使用相同的按钮和相同的标识符,因为当你改变布局时,按钮只在第一个布局中, !!!
  • 好吧,如果你需要一个新的 Activity ,然后再看我的编辑:你可以使用一个意图来做到这一点,这很简单,
  • 嗨,Houcine,谢谢我就在附近!我编辑了这个问题,我遇到了强制关闭错误。更新后的问题包含新活动的代码和 logcat 所说的内容
  • 嗨克里斯,看我的编辑:),我想你忘记了 super.onCreate() ;
  • 哇,它就像一个魅力,非常适合我正在寻找的东西!非常感谢侯钦! :)
【解决方案3】:

我认为您尝试做的事情应该通过多个活动来完成。如果您正在学习 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);

【讨论】:

    【解决方案4】:

    我知道我要来这么晚了,但到底是怎么回事。

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

    作为测试,我添加了 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 的无效。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        所以在布局中

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

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

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

        【讨论】:

        • 您也可以将 android:onClick 添加到按钮
        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          很简单,只要这样做:

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

          【讨论】:

            猜你喜欢
            • 2021-01-19
            • 1970-01-01
            • 2013-11-08
            • 1970-01-01
            • 2011-11-23
            • 2017-05-08
            • 2012-03-17
            • 2013-11-28
            • 1970-01-01
            相关资源
            最近更新 更多