2016-03-25 2 views
0

Эти вызовы в onPostResume абстрактных действий, безусловно, происходят после setContentView(R.layout.activity_method_two); в дочерних классах. Но я получаю java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.RadioButton.setChecked(boolean)' on a null object reference в любом случаеonPostReume в абстрактном классе, получающем нуль ContentView после того, как onCreate в дочернем классе создает экземпляр

Почему я не могу это сделать?

public class MethodTwo extends AbstractMethod { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_method_two); 
    } 

    @Override 
    void set_default_method() { 
     rb_default = (RadioButton) findViewById(R.id.radio_button_method_two); 
    } 

} 

и

public abstract class AbstractMethod extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener { 
    RadioGroup rg_method; 
    RadioButton rb_default; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     set_default_method(); 
    } 

    @Override 
    protected void onPostResume() { 
     super.onPostResume(); 

     rb_default.setChecked(true); 

     rg_method = (RadioGroup) findViewById(R.id.radio_group_method_select); 
     rg_method.setOnCheckedChangeListener(this); 
    } 

выдает ошибку в трассировки стека:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.RadioButton.setChecked(boolean)' on a null object reference 

если я двигаю setContentView в OnCreate в абстрактном классе (сразу после super.oncreate()), он работает .. но тогда у меня нет абстрактного класса для нескольких дочерних классов.

+0

Если вы поставите 'setContentView (R.layout.activity_method_two); 'в абстрактном классе это происходит? – newhouse

+0

Я только что вернулся, вспомнив, что забыл добавить это к описанию :) –

+1

[Этот ответ] (http://stackoverflow.com/a/29953146/1435985) - одно из возможных решений. Вы перемещаете 'setContentView' в абстрактный класс, и классы реализации переопределяют метод для предоставления идентификатора макета. –

ответ

1

Создать абстрактный метод как это:

abstract int getContentId(); 

И называют его в onCreate() от абстрактного класса, как этот

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(); 
    setContentView(getContentId()); 
} 

Она должна быть работа

+0

спасибо, что сделал. на самом деле все вещи, которые я перенес в onPostResume, не могли вернуться к onCreate. –

+0

, поэтому я подумал об этом еще и, честно говоря, я все еще смущен. почему «_Call_» в 'setContentView' должен произойти в абстрактном классе? Если я следую этому совету и _move_ его там, это не в дочернем классе, поэтому почему 'rb_default' продолжает работать там? или, если он будет работать в дочерних классах, почему мне пришлось перенести его в абстрактный класс? –

Смежные вопросы