2016-03-25 9 views
0

diese Anrufe in onPostResume der abstrakten Tätigkeit geschehen definitiv nach setContentView(R.layout.activity_method_two); in den Kindklassen. Aber ich bekomme java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.RadioButton.setChecked(boolean)' on a null object reference auf jeden FallonPostReume in der abstrakten Klasse, die null erhält Inhalt Inhalte nach onCreate in der Kindklasse instanziiert es

Warum kann ich das nicht tun?

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); 
    } 

} 

und

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); 
    } 

erzeugen einen Fehler in dem Stack-Trace:

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

wenn ich die setContentView in die onCreate in der abstrakten Klasse (nur nach super.oncreate()) bewegen, es funktioniert .. aber dann habe ich keine abstrakte Klasse für mehrere Kindklassen.

+0

sein, wenn Sie 'setContentView setzen (R.layout.activity_method_two); 'Auf der abstrakten Klasse passiert es ?? – newhouse

+0

Ich kam gerade zurück und erinnerte mich, dass ich vergessen habe, das zur Beschreibung hinzuzufügen :) –

+1

[Diese Antwort] (http://stackoverflow.com/a/29953146/1435985) ist eine mögliche Lösung. Sie verschieben 'setContentView' in die abstrakte Klasse und lassen die implementierenden Klassen eine Methode überschreiben, um die Layout-ID bereitzustellen. –

Antwort

1

Eine abstrakte Methode wie folgt aus:

abstract int getContentId(); 

Und es in der onCreate() von der abstrakten Klasse nennen wie diese

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

Es sollte Arbeit

+0

danke, das hat es getan. in der Tat konnten all die Sachen, die ich in onPostResume migriert hatte, nicht zu onCreate zurückkehren. –

+0

also habe ich darüber noch etwas mehr nachgedacht und ehrlich gesagt bin ich immer noch verwirrt. Warum muss _call_ to 'setContentView' in der abstrakten Klasse vorkommen? Wenn ich diesem Rat folge und _move_ es dort, es ist nicht in der Kindklasse, also warum funktioniert 'rb_default' dort weiter? oder, wenn es in den untergeordneten Klassen funktionieren soll, warum musste ich es überhaupt in die abstrakte Klasse verschieben? –