2011-05-25 72 views
21

我不得不採取以下代碼來選擇按鈕點擊佈局。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」按鈕時,什麼都不會發生。

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

+0

在兩個佈局中檢查您的按鈕ID .. – Sujit 2011-05-25 09:03:15

+0

它是否在第一個佈局中的按鈕ID與第二個佈局相同時是probibited? – Kris 2011-05-25 09:14:42

+0

不,只要它在每個佈局文件中只出現一次,那應該可以。 – Flo 2011-05-25 09:15:49

回答

19
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

+0

此代碼具有相同的效果... – Kris 2011-05-25 09:17:10

+0

@Kris:請參閱我的編輯,我認爲您應該在第二個佈局中使用相同的標識符具有相同的按鈕,因爲當您更改佈局時,按鈕僅在第一個佈局,!!! – Houcine 2011-05-25 09:20:04

+0

感謝您的努力@Houcine,但我認爲它確實需要一個新的活動...... – Kris 2011-05-25 09:47:51

0

首先,我會建議在你的交換機的每種情況下都要記錄日誌,以確保你的代碼被調用。

然後我會檢查佈局實際上是不同的。

+0

感謝您的回覆,我放了一個日誌,並調用了代碼,是的佈局是不同的。 – Kris 2011-05-25 08:59:28

2

我認爲你要做的事情應該用多個活動來完成。如果你在學習Android,理解活動是你必須解決的問題。試圖用一個活動編寫整個應用程序最終會變得更加困難。閱讀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); 
0

我知道我來這麼晚,但什麼赫克。

我已經幾乎與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類。這工作完美。所以我不知道爲什麼人們建議使用不同的活動/意圖。也許有人可以解釋爲什麼我的代碼工作和克里斯沒有。

2

您想要在按鈕單擊時在運行時更改佈局。但這是不可能的,因爲上面已經正確地陳述了,您需要重新開始活動。當你計劃根據用戶的選擇改變主題時,你會遇到類似的問題,但它不會在運行時反映出來。您將不得不重新開始活動。

7

我會將一個添加到佈局,然後更改活動中的佈局。

佈局

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

然後在活動

所以添加以下內容:

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

您可以將android:onClick添加到按鈕以及 – cw1998 2012-07-23 10:37:24

1

的logcat中顯示了錯誤,你應該叫super.onCreate(savedInstanceState)

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    //... your code 
} 
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 

     } 

    });