2015-11-04 3 views
1

Прежде всего, моя программа компилируется и запускается. Но как только вы вставляете в LinearLayout, который использует GestureDetector, он выдает исключение NullPointerException.GestureDetector NullPointerException в «пустом» макете

У меня есть действие, в котором фрагмент с именем «OrderFragment» вложен.

public class OrderFragment extends Fragment { 
View view; 
Activity activty; 
@Override 
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) { 
    view = inflater.inflate(R.layout.orderfragment, container, false); 
    return view; 
} 


@Override 
public void onResume(){ 
    super.onResume(); 
    DragList orderContainer = (DragList) view.findViewById(R.id.orderContainer); 
    for (int i=0;i<5;++i) { 

     final TextView tv = new TextView(getActivity().getApplicationContext()); 
     tv.setTextColor(0x888888); 
     tv.setText("wtf"); 
     orderContainer.addView(tv,new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 
    } 

} 

} 

Здесь я хочу программно добавить TextView в DragView. Этот DragView существует в orderfragment.xml

В классе DragView я пытаюсь создать некоторые текстовые элементы, пользователи могут перетаскивать и заменять этот путь. Но я изо всех сил пытаюсь заставить Draging работать. Пожалуйста, обратите внимание, что onTouchEvent функция копируется дословно с официального андроида Webiste here

public class DragList extends LinearLayout { 


public DragList(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 

public DragList(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(context); 
} 

private void init(Context context) { 
    //do stuff that was in your original constructor... 
} 

// The active pointer is the one currently moving our object. 
private int INVALID_POINTER_ID = -1; 
private int mActivePointerId = INVALID_POINTER_ID; 
private float mLastTouchX; 
private float mLastTouchY; 
private GestureDetector mScaleDetector; 

public DragList(Context context) { 
    super(context); 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    // Let the ScaleGestureDetector inspect all events. 

    mScaleDetector.onTouchEvent(ev); 

    final int action = MotionEventCompat.getActionMasked(ev); 

    switch (action) { 
     case MotionEvent.ACTION_DOWN: { 
      final int pointerIndex = MotionEventCompat.getActionIndex(ev); 
      final float x = MotionEventCompat.getX(ev, pointerIndex); 
      final float y = MotionEventCompat.getY(ev, pointerIndex); 

      // Remember where we started (for dragging) 
      mLastTouchX = x; 
      mLastTouchY = y; 
      // Save the ID of this pointer (for dragging) 
      mActivePointerId = MotionEventCompat.getPointerId(ev, 0); 
      break; 
     } 

     case MotionEvent.ACTION_MOVE: { 
      // Find the index of the active pointer and fetch its position 
      final int pointerIndex = 
        MotionEventCompat.findPointerIndex(ev, mActivePointerId); 

      final float x = MotionEventCompat.getX(ev, pointerIndex); 
      final float y = MotionEventCompat.getY(ev, pointerIndex); 

      // Calculate the distance moved 
      final float dx = x - mLastTouchX; 
      final float dy = y - mLastTouchY; 

      float mPosX = dx; 
      float mPosY = dy; 



      // Remember this touch position for the next move event 
      mLastTouchX = x; 
      mLastTouchY = y; 

      break; 
     } 

     case MotionEvent.ACTION_UP: { 
      mActivePointerId = INVALID_POINTER_ID; 
      break; 
     } 

     case MotionEvent.ACTION_CANCEL: { 
      mActivePointerId = INVALID_POINTER_ID; 
      break; 
     } 

     case MotionEvent.ACTION_POINTER_UP: { 

      final int pointerIndex = MotionEventCompat.getActionIndex(ev); 
      final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex); 

      if (pointerId == mActivePointerId) { 
       // This was our active pointer going up. Choose a new 
       // active pointer and adjust accordingly. 
       final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
       mLastTouchX = MotionEventCompat.getX(ev, newPointerIndex); 
       mLastTouchY = MotionEventCompat.getY(ev, newPointerIndex); 
       mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex); 
      } 
      break; 
     } 
    } 
    return true; 
} 

}

Ошибка:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.view.GestureDetector.onTouchEvent(android.view.MotionEvent)' on a null object reference 
     at com.example.jacobusconradi.versuchstestappv20.DragList.onTouchEvent(DragList.java:46) 

И я могу также подтвердить, что DragList является визуально пуст или НЕ там, так как я вижу только белый цвет фона, данный Контейнеру. Когда я использую режим отладки, он ничего не бросает, когда я добираюсь до программно добавленного TextView.

спасибо за помощь и веселит

+0

Я не вижу инициализацию «mScaleDetector», поэтому бросает Nullpointert..Plz инициализирует эту переменную – Satya

+0

Где вы создаете экземпляр mScaleDetector? – Nanoc

+0

@Satya Я делаю 5 строк над строкой onTouchEvent (motionEvent ev) над конструктором smalles DragList – PlatinTato

ответ

2

Пожалуйста инициализацию mScaleDetector в вашем Constructor разделе

http://developer.android.com/intl/es/reference/android/view/GestureDetector.html

mScaleDetector = new GestureDetector(context); 

Наконец

public DragList(Context context) { 
    super(context); 
    mScaleDetector = new GestureDetector(context); 
    } 
+0

ok теперь я серьезно запутался.Когда я это делаю, он говорит, что он устарел, и нет возможности для конструктора GestrureDetector использовать контекст, но он хочет передать его в OnGestureListener. – PlatinTato

+0

@JacobusConradi http://stackoverflow.com/questions/12873708/gesturedetector -deprecated-вопрос –

0

Пожалуйста INST antiate your gesture Detector

public DragList(Context context) { 
    super(context); 
    mScaleDetector = new GestureDetector(context); 
} 

Надеюсь, что это поможет.

EDIT

Вам не нужно gestureDetector за то, что вы делаете, вы можете просто удалить его, и он должен работать.

Вам нужно будет передать OnGestureListener, если вы хотите, чтобы gestureDetector смог что-то сделать.

Смежные вопросы