[英]android: how to change layout on button click?
我必須按照代碼選擇按鈕點擊時的布局。
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說:
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");
}
注意:檢查此(斷開鏈接)關於如何在活動之間切換的教程 。
我會在布局中添加一個android:onClick
,然后更改活動中的布局。
所以在布局中
<ImageView
(Other things like source etc.)
android:onClick="changelayout"
/>
然后在活動中添加以下內容:
public void changelayout(View view){
setContentView(R.layout.second_layout);
}
您希望在按鈕單擊時在運行時更改布局。 但這是不可能的,正如上面所說,你需要重新啟動活動。 當您計划根據用戶的選擇更改主題時,您會遇到類似的問題,但它不會在運行時反映出來。 您必須重新啟動活動。
我認為你要做的事情應該是多項活動。 如果您正在學習Android,那么理解活動是您必須要解決的問題。 嘗試用一個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);
我知道我遲到了,但到底是什么。
我有幾乎與Kris完全相同的代碼,只使用一個Activity但有兩個不同的布局/視圖,我想隨意切換布局。
作為測試,我添加了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沒有。
logcat顯示錯誤,你應該調用super.onCreate(savedInstanceState)
:
@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
}
});
首先,我建議在每個交換機的情況下放一個Log來確保你的代碼被調用。
然后我會檢查布局實際上是不同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.