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", ничего не происходит.
Эта ссылка говорит, что я должен начать новую деятельность.
Но я не знаю, как использовать код для намерения начать новую активность, добавится ли новый файл?
EDIT:
У меня есть код для новой активности:
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]()
Ответы
Ответ 1
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: проверьте (ссылка неработающая ссылка) Учебное пособие о том, как переключаться между действиями.
Ответ 2
Я бы добавил android:onClick
к макету, а затем изменил макет в своей деятельности.
Итак, в макете
<ImageView
(Other things like source etc.)
android:onClick="changelayout"
/>
Затем в операции добавьте следующее:
public void changelayout(View view){
setContentView(R.layout.second_layout);
}
Ответ 3
Я думаю, что то, что вы пытаетесь сделать, должно быть сделано с несколькими действиями. Если вы изучаете Android, понимание действий - это то, что вам придется решать. Попытка написать целое приложение только с одним Управлением будет намного сложнее. Прочтите эту статью, чтобы начать работу, тогда вам нужно больше что-то вроде этого:
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
Вы хотите изменить макет во время выполнения при нажатии кнопки. Но это невозможно, и, как было справедливо указано выше, вам необходимо перезапустить эту деятельность. Вы столкнетесь с аналогичной проблемой, когда планируете изменить тему, основанную на выборе пользователя, но она не будет отображаться во время выполнения. Вам придется перезапустить активность.
Ответ 5
Лог-код показывает ошибку, вы должны называть super.onCreate(savedInstanceState)
:
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//... your code
}
Ответ 6
Сначала я бы предложил поставить Log в каждом случае вашего коммутатора, чтобы убедиться, что ваш код вызывается.
Тогда я бы проверял, что макеты на самом деле разные.
Ответ 7
Я знаю, что я прихожу к этому поздно, но что, черт возьми.
У меня есть почти тот же самый код, что и Kris, используя только одно действие, но с двумя разными макетами/представлениями, и я хочу переключаться между макетами по своему усмотрению.
В качестве теста я добавил два параметра меню, каждый из которых переключает вид:
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. Это прекрасно работает. Поэтому я понятия не имею, почему люди предлагают использовать разные действия/намерения. Может быть, кто-то может объяснить, почему мой код работает, а Крис этого не сделал.
Ответ 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
}
});