Я попробовал много разных способов реализовать салфетки влево и проведите пальцем вправо, ни одна из них не работает для меня. Я хотел, чтобы два фрагмента менялись местами, прокручивая. Я попробовал методы 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();
}
}
Я хочу, чтобы только 2-й и 3-й фрагменты менялись местами, но 1-й всегда остается в действии. поэтому я думаю, что пейджер-адаптер не подходит для этого –