Могу ли я использовать setContentView вне метода oncreate? - PullRequest
7 голосов
/ 09 января 2012

Я видел много людей, которые говорили, что вы можете установить setContentView вне метода oncreate, но я нигде не нашел примера.Теперь, когда я пытаюсь использовать setContentView, мое приложение просто падает.Вот мой исходный код:

AlarmActivity.java:

package com.alarm.example;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.RelativeLayout;

public class AlarmActivity extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button buton = new Button(this);
        buton.setId(101);
        buton.setText("New alarm");
        buton.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
        RelativeLayout layout1 = new RelativeLayout(this);  
        layout1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));  
    layout1.addView(buton);  
    setContentView(layout1); 

    Button nou =(Button)findViewById(101);
    nou.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            New_ala nou1=new New_ala();
            nou1.nou_alarma();
            }
        });
    }
}

New_ala.java:

package com.alarm.example;

public class New_ala extends AlarmActivity{
public void nou_alarma() {
setContentView(R.layout.timepicker);        
}
}

TimePicker.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >


    <TimePicker
        android:id="@+id/timePicker"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

    <LinearLayout 
        android:layout_height="wrap_content" 
        android:layout_width="fill_parent" 
        android:layout_alignParentBottom="true">

        <Button 
        android:id="@+id/picker_save" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:text="Save">
        </Button>

        <Button 
        android:id="@+id/picker_cancel" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_weight="1" 
        android:text="Cancel">
        </Button>
</LinearLayout>

</LinearLayout>

Более подробно, я могу использовать setContentView (R.layout.timepicker) внутри метода oncreate без каких-либо проблем, поэтому проблема в том, что setContentView не работает должным образом внутри класса New_ala.java.Кто-нибудь может мне помочь?

Код после установки намерения: AlarmActivity:

package com.alarm.example;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class AlarmActivity extends Activity{
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startActivity(new Intent(this, NewAlarmActivity.class));
        }
    }

NewAlarmActivity:

package com.alarm.example;
import android.os.Bundle;
public class NewAlarmActivity extends AlarmActivity{

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.timepicker);
}
    }

Ответы [ 3 ]

9 голосов
/ 09 января 2012

Вы можете вызывать setContentView в любое время, когда вы работаете в потоке событий (UI). Помните, что когда вы это сделаете, любые поля, которые вы инициализировали с помощью вызова findViewById, должны быть сброшены.

4 голосов
/ 09 января 2012

Лучший способ сделать это - выполнить несколько действий: вместо nou1.nou_alarma(); создать намерение и начать новое действие с новым макетом.

startActivity(new Intent(this, NewAlarmActivity.class));

И в методе onCreateиз NewAlarmActivity, установите просмотр содержимого на R.layout.timepicker

0 голосов
/ 09 января 2012

Метод setContentView() можно вызывать только один раз для каждого действия. Если вы хотите полностью изменить макет в какой-то момент, вы должны либо выбрать ViewFlipper, либо иметь 2 макета в упражнении и показать только один из них в данный момент, вызвав view.setVisibility(View.GONE); и view.setVisibility(View.VISIBLE); соответственно.

...