Selbsterstelltes Menu einblenden und als Singleton behandeln. Nur wie? NullPointerException

  • Antworten:2
Philip M.
  • Forum-Beiträge: 90

01.09.2011, 21:43:09 via Website

Guten Abend liebe Android Gemeinde,

da ich so zu sagen neu in der Android-Entwicklung bin, und nun mein erstes Projekt anliegt brauche ich das erstemal Hilfe. Ich hatte bisher das Buch "Einführung in die Android-Entwicklung" von Marko Gargenta durchgearbeitet, aber leider wurde dort mein Problem nicht mal im Ansatz angegangen.

Also, ich habe eine Activity (StartActivity) die beim Aufrufen der App gestartet wird, und eine weitere(MenuActivity), welche durch ein <include> in der XML Datei dieser Activity mit eingebettet ist. Soweit so gut.
Nun würde ich die MenuActivity gerne aus der StartActivity aufrufen bzw. deren Elemente(Buttons) abrufen, um auf diese OnClickListener zu setzen. Der Grund warum ich das so machen möchte ist, weil diese MenuActivity als Singleton bestehen soll. Heißt dieses Menü soll nur einmal existieren und ich kann es dann einfach auf die jeweils aufgerufene Activity setzen und die OnClickListener dort dynamisch setzen.

Meine Lösung sieht in etwa so aus (eben selbst zusammengeschrieben ohne IDE, da original Quellcode in der Firma liegt, Syntax Probleme sind im Original aber nicht vorhanden falls es hier der Fall sein sollte):

MainActivity
1class MainActivity extends Activity {
2
3MenuActivityController menuActivityController;
4
5public void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 setContentView(R.layout.MainActivity);
8 initialize();
9}
10
11public void initialize() {
12 menuActivityController = getMenuAcitivityControler();
13}
14
15public MenuActivityController getMenuAcitivityControler() {
16
17 if(menuActivityController == null) {
18 menuActivityController = MenuActivityController.getInstance();
19 menuActivityController.getMenuActivity.getButton().setOnClickListener(new OnClickListener() {
20 @Override
21 public void onClick(View v) {
22 // TODO
23 }
24 });
25 }
26}
27}

MenuActivityController
1public class MenuActivityController {
2
3 private MenuActivity menuActivity;
4 private static MenuActivityController menuActivityController = new MenuActivityController();
5
6 public MenuActivityController() {
7 menuActivity = getMenuActivity();
8 }
9
10 public MenuActivity getMenuActivity() {
11 if(menuActivity == null){
12 menuActivity = new MenuActivity();
13 }
14 return menuActivity;
15 }
16
17 public static MenuActivityController getInstance() {
18 return menuActivityController;
19 }
20}

MenuActivity
1public class MenuActivity extends Activity() {
2 private Button button;
3
4 public void onCreate {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.MenuActivity);
7 }
8
9 public Button getButton() {
10 if(button == null) {
11 button = (Button)getViewById(R.id.button);
12 }
13 return button;
14 }
15
16}

MainActivity.xml

1<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="fill_parent" android:layout_height="fill_parent"
3 android:orientation="vertical">
4
5 <include layout="@layout/MenuActivity"/>
6
7
8</LinearLayout>


Mein Problem ist jetzt, das ich an der Stelle "button = (Button)getViewById(R.id.button);" von LogCat die Fehlermeldung "Null pointer Exception" bekomme, und die App nicht startet.

Meine Ahnung ist, das wenn ich "new MenuActivity();" aufrufe, die onCreate() Methode nie aufgerufen wird. Kann das sein? Und wenn ja, wie regelt man das dann, das ich dieses Menu als Singleton behandeln kann?

Kann mir von euch vllt jemand helfen? Ich bin echt am verzweifeln :( Tausend dank im Voraus.

Antworten
Markus Gu
  • Forum-Beiträge: 2.644

02.09.2011, 00:25:37 via App

der Aufbau ist so nicht möglich

du kannst werte in einem singleton speichern, aber nicht deine activity als singleton implemetieren

beim öffnen der 2. activity setzt dann die werte aus der singleton klasse

swordiApps Blog - Website

Philip M.

Antworten
Philip M.
  • Forum-Beiträge: 90

02.09.2011, 09:29:36 via Website

Danke für die schnelle Antwort (:

Ja, leider habe ich das befürchtet, dass das so nicht geht. Die Sache ist ja die, das es sich bei der zweiten Activity lediglich um ein kleines Menu handelt, welches direkt in der ersten Activity eingebettet ist.

Wie kann ich diesem Menu denn jetzt genau sagen in welche Activity es grade eingebunden ist oder wie kann ich die OnClickListener von außen auf die Buttons dieser MenuActivity setzen?

Könntest du mir das vielleicht anhand eines Beispieles erklären? Würde mir zur verständlichkeit viel helfen. (:

//Edit:
Helfen würde mir auch, wenn ich wüsste wie ich eine Klasse erstellen könnte, mit der ich die Elemente der MenuActivity verwalten könnte, ohne das die Java-Klasse eine Activity ist.

Aber ich komm nicht an die Elemente, in diesem Fall Buttons ran, ohne das ich mich in einer Activity Klasse befinde, oder?

//Edit2:
Also ich bin jetzt soweit das ich denke das ich mit <merge /> am ehesten an mein Ziel kommen kann.
Nun habe ich die Klasse MenuView nicht mehr extends Activity sondern extends LinearLayout und habe die Java Klasse einfach in der XML-Datei angegeben.
1<de.firma.projekt.MenuView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:id="@+id/MenuActivity" />

Der Konstruktor sieht wie folgt aus:
1public MainMenuView(Context context, AttributeSet attrs) {
2 super(context, attrs);
3 LayoutInflater.from(context).inflate(R.layout.MenuLayout, this, true);
4
5
6 }

Jetzt kann ich aus der MainActivity ohne Problme auf die Buttons zugreifen, aber wenn ich z.B. einen onClickListener setze, dann passiert nicht. Der Listener scheint nicht richtig gesetzt zu werden:

1MainMenuController mainMenu = MainMenuController.getInstance();
2mainMenu.getMainMenuLayout(this, null).getButton().setOnClickListener(new OnClickListener() {
3
4 @Override
5 public void onClick(View v) {
6 Toast.makeText(OrderDrinksView.this, "Home", Toast.LENGTH_SHORT).show();
7
8 }
9 });

Kann mir von euch vielleicht jemand erklären wie das mit <merge> richtig funktioniert?

— geändert am 02.09.2011, 12:58:18

Antworten