web-dev-qa-db-ja.com

android:ボタンクリックでレイアウトを変更する方法は?

ボタンをクリックしてレイアウトを選択するには、次のコードに従う必要があります。

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は言います:enter image description here

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

EDIT:コードのこの部分を更新します:):

@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:これを確認してください (壊れたリンク)アクティビティを切り替える方法についてのチュートリアル

20
Houcine

レイアウトにAndroid:onClickを追加してから、アクティビティのレイアウトを変更します。

レイアウトで

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

次に、アクティビティに次を追加します。

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

ボタンのクリック時に実行時にレイアウトを変更したかった。しかし、それは不可能であり、上で正しく述べられているように、アクティビティを再起動する必要があります。ユーザーの選択に基づいてテーマを変更しようと計画しているときに、同様の問題に遭遇しますが、ランタイムには反映されません。アクティビティを再起動する必要があります。

2

私はこれに遅く来ていることを知っていますが、一体何でしょう。

Krisとほぼ同じコードを使用しています。1つのアクティビティのみを使用しますが、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);
        }
    }

注、1つのActivityクラスがあります。これは完全に機能します。だから、なぜ人々がさまざまなアクティビティ/インテントの使用を提案しているのか分かりません。たぶん誰かが私のコードが機能し、クリスが機能しなかった理由を説明できるでしょう。

2
Kevin

あなたがしようとしていることは、複数のアクティビティで行うべきだと思います。 Androidを学習している場合、アクティビティを理解することは取り組む必要があるものです。 1つのアクティビティだけでアプリ全体を作成しようとすると、はるかに困難になります。 この記事 を読んで、始めてみてください。そうすれば、次のような結果になります。

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

Logcatはエラーを表示します。super.onCreate(savedInstanceState)を呼び出す必要があります:

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

それは非常に簡単です、ただこれをしてください:

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
arun bhati

まず、スイッチの各ケースにログを入れて、コードが確実に呼び出されるようにすることをお勧めします。

次に、レイアウトが実際に異なることを確認します。

0
Jason Rogers