removeView() funktioniert nicht immer????

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • removeView() funktioniert nicht immer????

    Hallo,
    ich habe eine MainActivity mit einem IntroView (Logo wird eingeblendet und der View verschwindet langsam), einem Level1View und einem Level2View. Diese Views beinhaltet Bitmaps welche in der OnDraw gemalt werden und in der OnTouchEvent nach Berührungen kontrolliert werden. Level1View und Level2View sind public static, damit andere Klassen darauf zugreifen können (eine andere Idee hatte Ich nicht). Nachdem der IntroView transparent ist (getAlpha = 0), wird MainActivity.layout.removeView(this) im IntroView aufgerufen. Das funktioniert auch super. Wenn ich aber (MainActivity.layout.removeView(this) in dem Level1View verwende bekomme Ich einen Nullpointer, dass Level1View nicht deklariert wurde, das ist aber falsch, da ich in der onCreate den Konstruktiv jeweils aufrufe. Ich blicke da gerade nicht ganz durch, ich hatte auch schon öfters Probleme mit removeView daher bin ich sehr frustriert.
    Ich verwende eine RelativeLayout.

    Hoffentlich erkennt ihr in der MainActivity oder so einen Fehler :)

    Hier der Code der MainActivity:

    Quellcode

    1. package catgames.lineland;
    2. import android.app.Activity;
    3. import android.content.Context;
    4. import android.os.Bundle;
    5. import android.widget.RelativeLayout;
    6. import catgames.framework.Music;
    7. import catgames.views.HudView;
    8. import catgames.views.IntroView;
    9. import catgames.views.Level1;
    10. import catgames.views.Level2;
    11. public class MainActivity extends Activity {
    12. // Layout
    13. public static RelativeLayout layout;
    14. // Views
    15. IntroView introview;
    16. public static HudView hudview;
    17. // Level
    18. public static Level1 level1;
    19. public static Level2 level2;
    20. // Music
    21. public static Music music;
    22. // Context
    23. public static Context context;
    24. @Override
    25. protected void onCreate(Bundle savedInstanceState) {
    26. super.onCreate(savedInstanceState);
    27. // Context
    28. context = this;
    29. // Layout
    30. layout = new RelativeLayout(this);
    31. layout.setBackgroundResource(R.drawable.backdrop);
    32. setContentView(layout);
    33. // Views
    34. introview = new IntroView();
    35. layout.addView(introview);
    36. // Level
    37. level1 = new Level1();
    38. level2 = new Level2();
    39. // Music
    40. music = new Music(R.raw.music);
    41. music.setLooping(true);
    42. music.play();
    43. }
    44. }
    45. Hier der Code des IntroViews:
    46. package catgames.views;
    47. import android.graphics.Canvas;
    48. import android.view.View;
    49. import catgames.framework.Image;
    50. import catgames.lineland.MainActivity;
    51. import catgames.lineland.R;
    52. import catgames.lineland.Settings;
    53. public class IntroView extends View {
    54. // Files
    55. Image logo;
    56. // Firsttime
    57. boolean firsttime;
    58. // Timer
    59. int timer;
    60. /* CONSTRUCTOR */
    61. public IntroView() {
    62. super(MainActivity.context);
    63. // Loading
    64. logo = new Image(R.drawable.introscreen_horizontal);
    65. // Vars
    66. firsttime = true;
    67. timer = 0;
    68. }
    69. /* DRAW */
    70. public void onDraw(Canvas c) {
    71. // Firsttime
    72. if (firsttime) {
    73. // Update Settings
    74. Settings.screenwidth = c.getWidth();
    75. Settings.screenheight = c.getHeight();
    76. // Scaling
    77. logo.scaleFullscreen();
    78. // Loading
    79. MainActivity.hudview = new HudView();
    80. MainActivity.level1.load();
    81. MainActivity.level2.load();
    82. MainActivity.level2.setX(c.getWidth());
    83. MainActivity.layout.addView(MainActivity.level1);
    84. MainActivity.layout.addView(MainActivity.level2);
    85. MainActivity.layout.addView(MainActivity.hudview);
    86. this.bringToFront();
    87. // Firsttime Update
    88. firsttime = false;
    89. }
    90. // Timer
    91. if (timer > 60) {
    92. // Change View
    93. this.setAlpha((float) (this.getAlpha() - 0.05));
    94. if (this.getAlpha() == 0) {
    95. MainActivity.layout.removeView(this);
    96. }
    97. } else {
    98. // Timer Update
    99. timer ++;
    100. }
    101. // Draw
    102. logo.draw(c);
    103. // Repeat
    104. invalidate();
    105. }
    106. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von CatGames ()

  • Meines erachtens ist das static dein Problem. Gerade Klassenvariablen einer Activity mache nie static, es ist unnötig und kann zu problemen z.b. in parallelisierung führen.

    Du kannst sowieso nicht einfach über activities hinweg auf views zugreifen. Aber wie es aussieht willst du die Views ja nur in einer anderen View nutzen, da könntest du zwei dinge machen:
    1. Du instanziierst die beiden Views erst in deiner IntroView
    2. Du instanziierst die beiden Views in deiner MainActivity und gibst sie in deine Introview hinein und speicherst sie dort nochmal als klassenvariablen.

    Und du solltest im codecontainer dringlichst einrückung verwenden. :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Ben ()

  • Ich dachte mir das mit dem static auch, komischerweise ist es ohne static ebenfalls ein Nullpointer? Ich probier es morgen nochmal genauer aus ...

    Die Views müssen static (also quasi global) sein, da Ich von den Views aus (den Leveln) auf die anderen Views aus zugreifen möchte, wenn ich zB. in Level1 in der onDraw level2 verschieben möchte (setX(getX() - 1) oder so).

    Ich hoffe du verstehst was ich meine.