2013-05-10 2 views
0

J'ai mis en place un SlidingMenu, je l'ai configuré avec SlidingMenu sm = getSlidingMenu() dans l'activité que je veux utiliser le menu. Le problème que j'ai, je veux le basculer via un bouton que j'ai créé sur un canevas. Si je clique sur cette zone sur la toile, il arrête de dessiner et ouvre le menu coulissant - fonctionne jusqu'à ici. Mais ensuite j'ai ajouté du contenu avec une linearlayout et une textview, en cliquant sur le texte, le texte change (genre de menu pour changer certaines options). Et après il a changé une fois le clic suivant devrait basculer le menu coulissant à nouveau. J'ai créé la dans une autre classe, et a déclenché une méthode qui se cache derrière vue dans l'activité contenant le SlidingMenu, il ressemble à ceci:Android SlidingMenu nullpointer sur toggle

public void toggleSM() { 
    Thread splash = new Thread(new Runnable() { 

     @SuppressWarnings("static-access") 
     @Override 
     public void run() { 
      try { 
       Thread.currentThread().sleep(500); 
       getSlidingMenu().toggle(true); 
       Thread.currentThread().sleep(1000); 
       animateButton.setLeftState(false); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     } 
    }); 
    splash.start(); 
} 

j'ai ajouté le sommeil pour éviter les problèmes causés par l'animation sm ou changer content, aninamteButton doit à nouveau déclencher le dessin de la toile. Mais il jette une exception nullpointer. Avec et sans animation du menu coulissant.

EDIT:

Les deux classes que je utilise:

public class Ingame extends SlidingActivity implements OnTouchListener{ 

private LeftMenu lm; 
private SlidingMenu sm; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    sh = new ScreenHandler(this); 
    fh = new FilesHandler(this); 
    animateMap = new AnimateMap(this); 
    ch = new CoordsHandler(this); 
    animateButton = new AnimateButton(); 
    sched = new Schedule(); 
    lm = new LeftMenu(this); 

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setupViews(); 

    lm.setupLeftMenu(); 
    setBehindContentView(lm.getLayout()); 
    setupSlidingMenu(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    gb.pause(); 
} 
@Override 
protected void onResume() { 
    super.onResume(); 
    gb.resume(); 
} 

@SuppressWarnings("deprecation") 
public void setupViews() { 
    FrameLayout fl = new FrameLayout(getBaseContext()); 
    LayoutParams sizeP = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
    fl.setLayoutParams(sizeP); 
    fl.setBackgroundColor(Color.rgb(0, 153, 204)); 

    gb = new GameBoard(getBaseContext()); 
    LayoutParams fillP = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
    gb.setLayoutParams(fillP);  

    gb.setOnTouchListener(Ingame.this); 
    fl.addView(gb); 
    setContentView(fl); 
} 

public void setupSlidingMenu() { 
    sm = getSlidingMenu(); 
    sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE); 
    sm.setMenu(lm.getLayout()); 
} 

@SuppressWarnings("static-access") 
@Override 
public boolean onTouch(View v, MotionEvent e) { 
    float distX, distY; 
    switch (e.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      startX = e.getX(); 
      startY = e.getY(); 
      gb.movedDist.put("startX", startX); 
      gb.movedDist.put("startY", startY); 
      finX = finY = -1; 
      gb.movedDist.put("finX", finX); 
      gb.movedDist.put("finY", finY); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      finX = e.getX(); 
      finY = e.getY(); 
      distX = startX - finX; 
      distY = startY - finY; 
      if(!checkUnvalidValues() && (Math.abs(distX) > sh.getTSize() || Math.abs(distY) > sh.getTSize())) { 
       int rectDistX = (int) (distX/sh.getTSize()); 
       int rectDistY = (int) (distY/sh.getTSize()); 
       noMove = false; 
       if(!checkEdges(rectDistX, rectDistY)) { 
        animateMap.animateXYDistance(rectDistX, rectDistY); 
        startX = e.getX(); 
        startY = e.getY(); 
       } 
      } 
      break; 
     case MotionEvent.ACTION_UP: 
      finX = e.getX(); 
      finY = e.getY(); 
      if(checkButton() == IngameButton.PP) { 
       animateButton.changePPState();  
       break; 
      } 
      if(checkButton() == IngameButton.LEFT) { //WHERE I TRIGGER THE SLIDINGMENU 
       animateButton.setLeftState(true); 
       if(!animateButton.getPPState()) 
        animateButton.setPPState(true); 
       sm.toggle(true); 
       lm.openLeftMenu(); 
       break; 
      } 

      if(noMove && !checkUnvalidValues()) 
       animateMap.tellCoordinate(finX, finY); 
      noMove = true; 
      break; 
    } 
    return true; 
} 

private boolean checkUnvalidValues() { 
    if(startX <= sh.getSideSize()-1 || startX >= (sh.getScreenWidth()-sh.getSideSize())) 
     return true; 
    if(startY <= -1 || startY >= (sh.getScreenHeight()-sh.getBottomGUISize())) 
     return true; 
    if(finX <= sh.getSideSize()-1 || finX >= (sh.getScreenWidth()-sh.getSideSize())) 
     return true; 
    if(finY <= -1 || finY >= (sh.getScreenHeight()-sh.getBottomGUISize())) 
     return true; 
    return false; 
} 

public SlidingMenu getSM() { 
    return sm; 
} 

public void toggleSM() { 

    runOnUiThread(new Runnable() { 

     @SuppressWarnings("static-access") 
     @Override 
     public void run(){ 

       getSlidingMenu().toggle(true); 
       SlidingMenu sm = getSlidingMenu(); 
       sm.getAlpha(); 
      try { 
       Thread.currentThread().sleep(1000); 
       animateButton.setLeftState(false); 
      } catch(InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

LeftMenu:

public class LeftMenu { 

private Context context; 
private Ingame ingame; 
private AnimateButton animateButton; 

private LinearLayout ll; 
private LinearLayout.LayoutParams llp; 
private static LeftMenuPage page; 
private static int buttonTextSize = 15; 

public LeftMenu(Context context) { 
    this.context = context; 
    ingame = new Ingame(); 
    animateButton = new AnimateButton(); 
} 

public void setupLeftMenu() { 
    page = LeftMenuPage.OVERVIEW; 
    setupLinearLayout(); 
    setupButtons(); 
} 

@SuppressWarnings("deprecation") 
private void setupLinearLayout() { 
    ll = new LinearLayout(context); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    ll.setBackgroundColor(0xff000000); 
    llp = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.FILL_PARENT, 
     LinearLayout.LayoutParams.FILL_PARENT); 
    ll.setLayoutParams(llp); 
} 
public LinearLayout getLayout() { 
    return ll; 
} 

private void setupButtons() { 
    final TextView t1 = new TextView(context); 
    t1.setBackgroundColor(0xff000000); 
    t1.setTextColor(0xffffffff); 
    t1.setTypeface(null, Typeface.NORMAL); 
    t1.setTextSize(buttonTextSize); 
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.WRAP_CONTENT, 
     LinearLayout.LayoutParams.WRAP_CONTENT); 
    lp.weight = 1.0f; 
    lp.gravity=1; 
    t1.setLayoutParams(lp); 

    String content = null; 
    if(page == LeftMenuPage.OVERVIEW) { 
     content = "Creation Mode"; 
    } 
    else { 
     content = "Back"; 
    } 
    t1.setText(content); 
    ll.addView(t1); 

    t1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      t1.setTextColor(0xffcccccc); 
      switch(page) { 
       case OVERVIEW:  
        page = LeftMenuPage.CREATE; 
        t1.setText("Create Dwarves"); 

        ingame.toggleSM(); 
        if(!animateButton.getPPState()) 
         animateButton.setPPState(true); 

        break; 
       case CREATE: 
        ingame.toggleSM(); 
        if(!animateButton.getPPState()) 
         animateButton.setPPState(true); 
        break; 
      } 
      t1.setTextColor(0xffffffff); 
     } 
    }); 
} 

public void openLeftMenu() { 
    page = LeftMenuPage.OVERVIEW; 
} 

}

EDIT 2:

05-10 15:14:53.535: E/AndroidRuntime(25064): FATAL EXCEPTION: main 
05-10 15:14:53.535: E/AndroidRuntime(25064): java.lang.NullPointerException 
05-10 15:14:53.535: E/AndroidRuntime(25064): at com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity.getSlidingMenu(SlidingActivity.java:104) 
05-10 15:14:53.535: E/AndroidRuntime(25064): at me.G4meM0ment.DwarvenSkill.Ingame$1.run(Ingame.java:234) 
05-10 15:14:53.535: E/AndroidRuntime(25064): at android.os.Handler.handleCallback(Handler.java:615) 
05-10 15:14:53.535: E/AndroidRuntime(25064): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-10 15:14:53.535: E/AndroidRuntime(25064): at android.os.Looper.loop(Looper.java:137) 
05-10 15:14:53.535: E/AndroidRuntime(25064): at android.app.ActivityThread.main(ActivityThread.java:4918) 
05-10 15:14:53.535: E/AndroidRuntime(25064): at java.lang.reflect.Method.invokeNative(Native Method) 
05-10 15:14:53.535: E/AndroidRuntime(25064): at java.lang.reflect.Method.invoke(Method.java:511) 
05-10 15:14:53.535: E/AndroidRuntime(25064): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
05-10 15:14:53.535: E/AndroidRuntime(25064): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
05-10 15:14:53.535: E/AndroidRuntime(25064): at dalvik.system.NativeStart.main(Native Method) 

StackTrace, comme je l'ai déjà mentionen dans certains commentaires, getSlidingMenu renvoie null et mHelper (SlidingActivityHelper) provoque parce qu'il est nul

+0

stacktrace de logcat s'il vous plaît? –

+0

@SankarV avez-vous des idées sur ce que je fais de mal? – G4meM0ment

+0

quelle est la ligne SlidingActivity.java:104? –

Répondre

0
getSlidingMenu().toggle(true); 

doit fonctionner sur l'interface utilisateur de cette discussion. Déplacez-le à l'intérieur et Handler ou si vous êtes dans une activité d'utilisation

runOnUiThread(new Runnable() { 

    public void run(){ 
      getSlidingMenu().toggle(true); 
     } 
    }); 
+0

obtenant toujours le nullpointer, est-ce peut-être parce que je change le texte du textview ou parce que j'utilise une disposition linéaire? Car en changeant le texte le bord de l'activité glissé disparaît alors. – G4meM0ment

+0

puis-je voir la ligne où vous obtenez le NPE? – Blackbelt

+0

'getSlidingMenu(). Toggle (true)' – G4meM0ment