2013-05-10 45 views
0

我已經實現了SlidingMenu,我在其想要使用該菜單的活動中將其設置爲SlidingMenu sm = getSlidingMenu()。我得到的問題我想通過我在畫布上創建的按鈕進行切換。如果我在畫布上點擊這些區域,它將停止繪製並打開滑動菜單 - 直到此處才能運行。但後來我添加了一些內容,其中包含一個線性佈局和一個文本視圖,單擊textview文本更改(更改某些選項的菜單種類)。並且一旦下一次點擊再次切換滑動菜單,它改變後。 我創建了後面視圖的另一個類,並引發在包含slidingmenu活性的方法,它看起來像這樣:Android SlidingMenu空指針開關

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(); 
} 

我加入了睡眠,避免引起SM動畫或改變任何問題內容,aninamteButton將再次觸發畫布的繪製。但它會拋出一個空指針異常。有和沒有滑動菜單的動畫。

編輯:

的兩個階層的我正在使用:

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; 
} 

}

編輯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) 

堆棧跟蹤,我在一些評論已經mentionen,getSlidingMenu返回null,mHelper(SlidingActivityHelper)導致這一點,因爲它是空

+0

stacktrace from logcat please? – 2013-05-10 12:29:25

+0

@SankarV你有什麼想法我做錯了嗎? – G4meM0ment 2013-05-10 14:12:37

+0

這是行SlidingActivity.java:104? – 2013-05-10 14:17:09

回答

0
getSlidingMenu().toggle(true); 

必須在UI線程中運行。把它移進裏面和處理程序,或者如果你在一個Activity裏面使用

runOnUiThread(new Runnable() { 

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

仍然獲得空指針,這可能是因爲我改變了textview的文本,或者因爲我使用了線性佈局?因爲在改變文本時,活動的邊緣滑出然後消失。 – G4meM0ment 2013-05-10 12:38:34

+0

我可以在哪裏看到NPE的哪一行? – Blackbelt 2013-05-10 12:39:26

+0

'getSlidingMenu()。toggle(true)' – G4meM0ment 2013-05-10 12:41:28