Прежде всего, моя программа компилируется и запускается. Но как только вы вставляете в 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.
спасибо за помощь и веселит
Я не вижу инициализацию «mScaleDetector», поэтому бросает Nullpointert..Plz инициализирует эту переменную – Satya
Где вы создаете экземпляр mScaleDetector? – Nanoc
@Satya Я делаю 5 строк над строкой onTouchEvent (motionEvent ev) над конструктором smalles DragList – PlatinTato