2016-04-28 3 views
0

Derzeit versuche ich, die Basis-Benutzeroberfläche einer Anwendung so zu abstrahieren, dass sie um untergeordnete Fragmente erweitert werden kann, die Hauptelemente wie die Elemente der Navigation erben Einstellungsmenüs. Die untergeordneten Elemente würden dann die grundlegende Benutzeroberfläche verwenden und den Rest der Benutzeroberfläche erstellen. Wenn Sie jedoch die Ansicht nicht explizit in der onCreate-Methode der untergeordneten Klasse festlegen, ist das Ergebnis eine leere Aktivität.SetContentView führt zu einer leeren Benutzeroberfläche, wenn von anderer Stelle in der Anwendung aufgerufen

Ist es einfach nicht möglich, die Inhaltsansicht an anderer Stelle als im oncreate der untergeordneten Klasse festzulegen?

-Code unten:

Abstrakte Basisklasse:

public abstract class BaseUIActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 

protected DrawerLayout drawer; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //generateUI(R.layout.activity_main); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu m){ 
    getMenuInflater().inflate(R.menu.main, m); 

    return super.onCreateOptionsMenu(m); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) {...} 

@Override 
public void onBackPressed() {...} 

@Override 
public boolean onNavigationItemSelected(MenuItem item) {...} 

public void generateUI(int layoutID){ 


    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    //drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 

    Log.d("layoutID: ",""+String.valueOf(layoutID)); 
    this.setContentView(layoutID); 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    Log.d("Drawer: ", "" + String.valueOf(findViewById(R.id.drawer_layout))); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    Log.d("Toggle: ", "" + String.valueOf(toggle)); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 


    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 


} 

}

Probe Child:

public class MainActivity extends BaseUIActivity implements OnNavigationItemSelectedListener { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //setContentView(R.layout.activity_main); 


    //generateUI(R.layout.activity_main); 

    //listViewEvents = (ListView) findViewById(R.id.listViewEvents); 

} 

}

+0

Ihre Basisklasse ist abstrakt, Sie müssen Ihre Sicht übergeben, um die Ansicht für die erste Aktivität zu generieren. –

+0

@MurtazaKhursheedHussain Wenn ich mich nicht täusche, habe ich das gemacht, als ich den int-Wert der layoutID an generateUI() übergeben habe, was sie in einer eigenen setContentView verwendet, aber auch zu einer leeren Schnittstelle geführt hat. – Potatosaurus

+0

Welche Aktivitätsklasse hast du in deinem Manifest definiert? Ich würde erwarten, dass BaseUIActivity abstrakt ist und in Ihrem Manifest nicht enthalten ist. Sie sollten MainActivity stattdessen hinzufügen, bestätigen Sie bitte. – ishmaelMakitla

Antwort

0

Sie müssenbewegenin die MainActivity anstelle der abstrakten Klasse (BaseUIActivity), weil dies nicht instanziiert wird (was der Punkt ist, es abstrakt zu machen). Wenn Sie einen Teil des Codes in die Basisklasse einfügen möchten, um den tatsächlichen Code in den Aktivitätsklassen kleiner zu halten, können Sie das tun, aber setContentView sollte in der onCreate der Aktivitätsklasse sein, die instanziiert wird Ihr Fall der MainActivity. Folgen Sie the tutorial here, es bietet ein ziemlich gutes Beispiel für das, was Sie versuchen zu tun.

Verwandte Themen