0

Я попробовал много разных способов реализовать салфетки влево и проведите пальцем вправо, ни одна из них не работает для меня. Я хотел, чтобы два фрагмента менялись местами, прокручивая. Я попробовал методы onFling и onTouch, скопированные здесь и другими источниками, однако либо приложение не реагировало на касание, либо оно разбилось. Я пишу код реализации в MainActivity, который должен включать эти фрагменты, но когда я устанавливаю onTouch Listeners на фрагменты, он дает мне NullPointerException, однако я не знаю, можно ли добавить OnTouchListener в MainActivity? Во всяком случае, вот код, который я написал в прошлый раз, это дает мне ошибку:Проведите пальцем вправо или влево

Попытка записи в поле «android.app.FragmentManagerImpl android.app.Fragment.mFragmentManager» на нулевой ссылки на объект

import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.FrameLayout; 
import android.widget.RelativeLayout; 


public class MainActivity extends ActionBarActivity { 


    private FragmentManager mFragmentManager; 

    private Fragment_1to6 f1to6; 
    private Fragment_7to12 f7to12; 
    private buttonsFragment mButtonsFragment; 

    private FrameLayout relative1; 
    private RelativeLayout relative2; 

    float x1, x2; 
    float y1, y2; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mFragmentManager = getFragmentManager(); 

     relative1 = (FrameLayout) findViewById(R.id.fragment_container); 
     relative2 = (RelativeLayout) findViewById(R.id.fragment_7to12); 


     if (!isInTwoPaneMode()) { 
      mButtonsFragment = (buttonsFragment) mFragmentManager.findFragmentById(R.id.fragment_buttons); 
      FragmentTransaction ft = mFragmentManager.beginTransaction(); 
      ft.replace(R.id.fragment_container, new Fragment_1to6()); 
      ft.addToBackStack(null); 
      ft.commit(); 

      relative1.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        switch (event.getAction()) { 

         case MotionEvent.ACTION_DOWN: { 
          x1 = event.getX(); 
          y1 = event.getY(); 
          break; 
         } 

         case MotionEvent.ACTION_UP: { 
          x2 = event.getX(); 
          y2 = event.getY(); 

          // right to left 
          if (x1 > x2) { 
            changeToSecondFrag(); 

            mFragmentManager.executePendingTransactions(); 

           return true; 
          } if (x1 < x2) { 

            changeToFirstFrag(); 
            mFragmentManager.executePendingTransactions(); 

           return true; 

          } break; 

         } 
        } 
        return true; 
       } 
      }); 

     } else { 
      mButtonsFragment = (buttonsFragment) mFragmentManager.findFragmentById(R.id.fragment_buttons); 
      f1to6 = (Fragment_1to6) mFragmentManager.findFragmentById(R.id.fragment_1to6); 


      f7to12 = (Fragment_7to12) mFragmentManager.findFragmentById(R.id.fragment_7to12); 


     } 

     } 



    private boolean isInTwoPaneMode(){ 
    return findViewById(R.id.fragment_container) == null; 
} 

    public void changeToSecondFrag(){ 

      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      ft.replace(R.id.fragment_container, f7to12); 
      ft.addToBackStack(null); 
      ft.commit(); 

    } public void changeToFirstFrag(){ 

      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      ft.replace(R.id.fragment_container, f1to6); 
      ft.addToBackStack(null); 
      ft.commit(); 

    } 


     } 

ответ

1

Поскольку вы хотите пронести два фрагмента, почему бы вам не попробовать использовать ViewPager и FragmentPagerAdapter.

В этом руководстве вы узнаете, как добавить свои фрагменты в ViewPager для достижения эффекта левого и правого прокрутки.

http://www.truiton.com/2013/05/android-fragmentpageradapter-example/

Надеется, что это помогает.

+0

Я хочу, чтобы только 2-й и 3-й фрагменты менялись местами, но 1-й всегда остается в действии. поэтому я думаю, что пейджер-адаптер не подходит для этого –

2

пытаются справиться MotionEvent.ACTION_MOVE istead из ACTION_UP.

Давайте определим салфетки действие как «когда пользователь прикасается и перемещает палец больше, чем некоторое пороговое расстояние». Таким образом, ваш обработчик может выглядеть следующим образом:

boolean mSwipePending = false; // let's introduce this flag field 

... 

// inside touch listener 
case MotionEvent.ACTION_DOWN: 
    x1 = event.getX(); 
    y1 = event.getY(); 
    mSwipePending = true; 
    break; 

case MotionEvent.ACTION_UP: 
    mSwipePending = false; // do not care about swipe, if up 
    break; 

case MotionEvent.ACTION_MOVE: 
    if (mSwipePending) { 
     if (event.getX() > x1 + threshold) { 
      doSomethighWhenSwipeRight(); 
      mSwipePending = false; // stop next move handling 
     } else if (event.get(X) < x1 - threshold) { 
      doSomethighWhenSwipeLeft(); 
      mSwipePending = false; // stop next move handling 
     } 
    } 

Вы можете определить порог как некоторое заданное значение (например, 100), но лучше, чтобы рассчитать его через плотность экрана.

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