Android Kommunikation zwischen View und Activity

  • Antworten:8
  • Bentwortet
Darkside96
  • Forum-Beiträge: 18

06.04.2014, 20:27:13 via Website

Hallo Leute,
Ich habe in meinem Programm eine Activity und 2 Views. View1 wurde auf die Activity geladen und in View1 ist ein Button und dort ist die Variable public boolean buttonPressed deklariert. Drückt man auf den Button, dann wird für buttonPressed "true" zurückgegeben. In der Activity steht, dass wenn "buttonPressed" wahr ist, View2 geladen werden soll. Jedoch wenn ich bei dem Ablauf des Programms den Button drücke, wird View2 nicht geladen. Ich habe auch durch andere Methoden herausgefunden, dass für die Activity die Variable "buttonPressed" durch das drücken des Buttons nicht verändert wird, für View1 aber schon, da der Button bei mir die Farbe ändert, wenn die Variable auf "true" ist. View2 wird aber, wie gesagt, nicht geladen. Woran könnte das liegen und wie kann ich es zum Laufen kriegen?

Antworten
Fabian Simon
  • Forum-Beiträge: 359

07.04.2014, 10:57:14 via Website

HI,
also als empfehlung:
Pro View ein Activty.
Da du keinen Code gepostet hast, schaue ich mal in die Glaskugel.....
Ahja die Weiß die weiß ohne den entsprechenden Code auch nicht bescheid ...
schade oder

Antworten
Darkside96
  • Forum-Beiträge: 18

07.04.2014, 12:49:36 via Website

Hey,
Also pro View eine Activity zu haben wäre echt ziemlich aufwendig, da ich ja in dem Menü schon mehr als 4 Views hab. Wenn ich dann auf 8 Views komme brauche ich 8 Activities und das ist nicht gerade vorteilhaft.
Ok hier dann mal mein Code:
Activity
1public class TitleActivity extends Activity {
2
3@Override
4 protected void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 requestWindowFeature(Window.FEATURE_NO_TITLE);
7 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
8 WindowManager.LayoutParams.FLAG_FULLSCREEN);
9TitleView tView = new TitleView(this); // 1-9 BEDEUTEND
10 tView.setKeepScreenOn(true);
11 setContentView(tView);
12
13 if(TitleView.playButtonPressed){
14 PlayView pView = new PlayView(this);
15 pView.setKeepScreenOn(true);
16 setContentView(pView);
17 }
18 }
19}
TitleView
1public class TitleView extends View{
2
3 static boolean playButtonPressed; // ZUM PROBLEM
4 private Bitmap backgroundimg;
5 private Bitmap playButtonUp;
6 private Bitmap playButtonDown;
7
8 public TitleView(Context context) {
9 super(context);
10
11 playButtonUp =
12 BitmapFactory.decodeResource(getResources(), R.drawable.playbutton);
13
14 }
15
16 @Override
17 public void onSizeChanged (int w, int h, int oldw, int oldh){
18 super.onSizeChanged(w, h, oldw, oldh);
19 screenW = w;
20 screenH = h;
21 }
22
23 @Override
24 protected void onDraw(Canvas canvas){
25 Bitmap scaledTBI = Bitmap.createScaledBitmap(titleBackgroundImg, screenW, screenH, false);
26 canvas.drawBitmap(scaledTBI, 0, 0, null);
27 if(playButtonPressed){
28 canvas.drawBitmap(playButtonDown, (screenW/2)-(playButtonUp.getWidth())/2,
29 (screenH/2)-((playButtonUp.getHeight())/2) ,null);
30 } else {
31 canvas.drawBitmap(playButtonUp, (screenW/2)-(playButtonUp.getWidth())/2,
32 (screenH/2)-((playButtonUp.getHeight())/2) ,null);
33 }
34 }
35
36 public boolean onTouchEvent(MotionEvent event){
37 int eventaction = event.getAction();
38 int X = (int)event.getX();
39 int Y = (int)event.getY();
40
41 switch(eventaction){
42
43 case MotionEvent.ACTION_DOWN:
44 if(X > (screenW/2)-((playButtonUp.getWidth())/2) &&
45 X < ((screenW/2)-((playButtonUp.getWidth())/2)
46 + playButtonUp.getWidth()) &&
47 Y > (screenH/2)-(playButtonUp.getHeight()/2) &&
48 Y < ((screenH/2)-(playButtonUp.getHeight()/2))
49+ playButtonUp.getHeight()){
50
51 playButtonPressed = true; //ZUMPROBLEM
52
53 }//...Weiterer verlauf recht unwichtig
Ich habe es auch probiert statt

1a) static boolean playButtonPressed;
1b) boolean[] playButtonPressed= {false}
zu nehmen, da es ja als Array ein Referenzdatentyp ist und somit nur die Adresse zu der Activity kopiert wird. Trotzdem geschieht hier nichts, die Activity wechselt nicht auf playView, da für sie playButton true nicht wahr wird. Habe ich es vllt mit dem Array falsch gemacht?

— geändert am 07.04.2014, 13:12:33

Antworten
Darkside96
  • Forum-Beiträge: 18

09.04.2014, 18:34:29 via Website

@Fabian Simon
Da ist der Code q:

Antworten
Fabian Simon
  • Forum-Beiträge: 359

10.04.2014, 09:41:17 via Website

Ich bleibe dabei das man Pro View ein Activity nehmen sollte !
Da :
Es der übersichtlichkeit hilft.
Damit meine ich, es kommt doch keiner der den Code nicht kennt nicht mehr klar wenn element von Verschiendenen Views in einem Activity gebündelt werden.

Ich weiß ich weiß: "Aber ich entwickle doch alleine" --> Das ding ist nur wenn du es mal nicht mehr machst hast die so einen Stil angewöhnt.
Also ich wäre sehr vorsichtig wann ich mehrere View in einem Activity bündle....
Es gibt bestimmt momente an denen Das sinn machen kann. Aber im Normalfall glaub ich macht das keinen Sinn.
Ich persönlich gehe sogar her und schreibe komplexe View elemente nochmal in eine Eigenen Klasse.
Diese Viewelemente füge ich später den haup View hinzu.

Zu deinem Problem :
"Das kann so nie und nimmer funktionieren !"

"OnCreate" wird wie der Name schon sagt, beim "bauen des Activitys aufgerufen".
Das heißt: playButtonPressed wird nie true sein. Die Gui wird nämlich erst dann dagestellt, wenn die Methode onCreate abgearbeitet ist.
Das was du machen willst, wäre z.B. mit einem Event Konzept möglich.

und zwar so z.B.

1public interface IChangeView{
2 public void setNewView(View view);
3}
4----------------------------------------------------------------
5public class TitleActivity extends Activity implements IChangeView{
6@Override
7 protected void onCreate(Bundle savedInstanceState) {
8 TitleView tView = new TitleView(this);
9 setContentView(tView);
10}
11public void setNewView(View view){
12setContentView(view);
13}
14
15
16}
17---------------------------------------------------------------
18public class TitleView extends View{
19private IChangeView changeView;
20public TitleView(IChangeView view, Context context){
21changeView = view;
22this.context = context;
23}
24
25public void onBtnClick(){
26changeView.setNewView(new PlayView(this.context));
27}
28}


So...
das ist nur schematisch....
Das heißt muss noch verfeinert werden und die Mehtoden etc exsitieten so evt. nicht bzw. heißen anders...
Wiso eigentlich ein Spiel entwickeln ?? Wenn noch nichtmal die Grundlagen richtig verstanden ist.
Das Listener Prinzip ist eine Grundlagen EntwurfMuster !

Darkside96

Antworten
impjor
  • Forum-Beiträge: 1.793

10.04.2014, 14:10:44 via App

Also pro View eine Activity zu haben ist garantiert nur in ganz ganz ganz wenigen Fällen hilfreich. Willst du mir sagen, dass du für jeden Button, jede TextView eine eigene Activity erstellst? Wo wäre dann der Sinn von Layouts (die auch nur Views sind).
Auch eine Custom-View kann man problemlos in ein bestehendes Layout integrieren.

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Fabian Simon
  • Forum-Beiträge: 359

10.04.2014, 14:14:55 via Website

Ja du hast recht.
ich meinte mit Views das root layout.
Boha keinen anhnung. Ich hätts halt mit View beschrieben

— geändert am 10.04.2014, 14:16:01

Antworten
Darkside96
  • Forum-Beiträge: 18

10.04.2014, 17:22:18 via Website

@Fabian Simon
Stimmt das macht durchaus Sinn. Du meine Güte dabei war es doch so super einfach. Ich schäme mich >_< :DD Danke für deine Hilfe!
In Sachen Spiele habe ich irgendwie mehr drauf, als im Menü, das kannst du mir glauben.. Ich habe schon Spiele programmiert nur mit einem verdammt simplen Menü.
@Impjor
Ja da bin ich auch deiner Meinung!
Edit: Aber ja damit wäre mir schon geholfen und der Thread kann von mir aus geschlossen werden. Vielen Dank nochmal!
LG

— geändert am 10.04.2014, 17:23:05

Antworten
impjor
  • Forum-Beiträge: 1.793

10.04.2014, 17:47:43 via Website

Schön, dass letztendlich alles funktioniert.:grin:
Am besten setzt du den Thread noch auf "Beantwortet". Danke!

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Darkside96

Antworten