2017-02-20 2 views
1

У меня есть фрагмент, который отображает текст, когда вы нажимаете на него, и я хочу, чтобы моя активность могла перетащить весь фрагмент. Я поместил onTouchListener для FrameLayout, содержащего фрагмент, и onClickListener для фрагмента. Но мой onTouchListener никогда не срабатывает. Как передать onTouchEvent из onClick?Android: активность onTouch не вызвана из-за фрагментации onClick

Ниже приведены соответствующие части моего кода

activity_question.xml

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/linearlayout_question"> 

    <include 
     layout="@layout/toolbar_question" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <FrameLayout 
     android:id="@+id/framelayout_question_fragmentcontainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

QuestionActivity

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_question); 

    LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linearlayout_question); 
    linearLayout.setOnTouchListener(new View.OnTouchListener() { 

     private float dX, dY; 
     @Override 
     public boolean onTouch(View view, MotionEvent event) { 
      switch (event.getAction()) { 

       case MotionEvent.ACTION_DOWN: 

        dX = view.getX() - event.getRawX(); 
        dY = view.getY() - event.getRawY(); 
        break; 

       case MotionEvent.ACTION_MOVE: 

        view.animate() 
          .x(event.getRawX() + dX) 
          .y(event.getRawY() + dY) 
          .setDuration(0) 
          .start(); 
        break; 
       default: 
        return false; 
      } 
      return true; 
     } 
    }); 

    if (findViewById(R.id.framelayout_question_fragmentcontainer) != null) { 
     if (savedInstanceState != null) { 
      return; 
     } 

     // Create a new Fragment to be placed in the activity layout 
     if (DataService.hasNext()) { 
      Trivia trivia = DataService.getNext(); 
      triviaList.add(trivia); 
      QuestionFragment questionFragment = QuestionFragment.newInstance(trivia.getQuestion(), trivia.getAnswer()); 
      currentPosition = 0; 

      // Add the fragment to the 'fragment_container' FrameLayout 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.framelayout_question_fragmentcontainer, questionFragment).commit(); 
     } 
    } 

QuestionFragment

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_question, container, false); 
    TextView textViewQuestion = (TextView) view.findViewById(R.id.textview_question_question); 
    textViewQuestion.setText(mQuestion); 

    final TextView textViewAnswer = (TextView) view.findViewById(R.id.textview_question_answer); 
    textViewAnswer.setText(mAnswer); 

    view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      textViewAnswer.setVisibility(View.VISIBLE); 
     } 
    }); 
    return view; 
} 

ответ

0

Вам не нужно onClick - вы можете использовать только onTouch, и это должно устранить вашу проблему. Внутри onTouch вы также можете обнаружить щелчок - используя GestureDetector или просто обнаружив MotionEvent.ACTION_DOWN и MotionEvent.ACTION_UP, так как вам это подходит.

Если вы хотите использовать GestureDetecor, сделайте следующее:

gestureDetector = new GestureDetector(this, new SingleTapConfirm()); 

и внутри onTouch:

if (gestureDetector.onTouchEvent(arg1)) { 
    // tap detected 
    return true; 
} 
Смежные вопросы