Вопрос

Я использую ViewPager для реализации прокрутки в моем приложении для Android.Однако я бы хотел, чтобы предыдущий фрагмент отображался, когда пользователь использует кнопку "Назад" вместо завершения действия.Есть ли какой-нибудь способ сделать это?Спасибо Себастьян

Это было полезно?

Решение

Переопределить функциональность вашего Activity:

public class Activity extends Activity
{
    @Override
    public void onBackPressed()
    {
        // do stuff
        myFragment.onBackPressed();
    }
}

public class Fragment extends Fragment
{

    public void onBackPressed()
    {
        // do stuff
    }
}

Другие советы

У меня была похожая проблема, вот как я ее решил.У меня был ViewPager с 6 фрагментами и хотел отслеживать историю страницы и иметь возможность использовать кнопку «Назад», чтобы навигаться назад в истории.Я создаю объект java.util.Stack<Integer>, добавляйте его в него.

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

Мой код:

MyAdapter mAdapter;
ViewPager mPager;
Stack<Integer> pageHistory;
int currentPage;
boolean saveToHistory;

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

    mAdapter = new MyAdapter(getSupportFragmentManager());
    mPager = (ViewPager)findViewById(R.id.container);
    mPager.setAdapter(mAdapter);
    mPager.setOffscreenPageLimit(5);

    pageHistory = new Stack<Integer>();
    mPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
            if(saveToHistory)
                pageHistory.push(Integer.valueOf(currentPage));
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
    saveToHistory = true;
}

@Override
public void onBackPressed() {
    if(pageHistory.empty())
        super.onBackPressed();
    else {
        saveToHistory = false;
        mPager.setCurrentItem(pageHistory.pop().intValue());
        saveToHistory = true;
    }
};
.

Переопределение ниже метода в действии фрагмента должна решить вашу проблему.

@Override
public void onBackPressed() {
    if (mViewPager.getCurrentItem() == 0) {
        // If the user is currently looking at the first step, allow the system to handle the
        // Back button. This calls finish() on this activity and pops the back stack.
        super.onBackPressed();
    } else {
        // Otherwise, select the previous step.
        mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1);
    }
}
.

У меня есть те же проблема, и я следую за этим шагом ( отредактировал мой ответ - конечно, работаю для меня, дайте ему попробовать )

в основной активности, где есть 3 фрагмента в ViewPager, я создаю стек и push и pop данные.

private Stack<Integer> stackkk;
private ViewPager mPager;
private int tabPosition = 0;



    mTabLayout.setupWithViewPager(mPager);
    mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
    mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            tabPosition = tab.getPosition();
            mPager.setCurrentItem(tab.getPosition());

// here i have add the data into the stack in each tab click, as at first it will always be null so i add 0 position

            if (stackkk.empty())
                stackkk.push(0);

            if (stackkk.contains(tabPosition)) {
                stackkk.remove(stackkk.indexOf(tabPosition));
                stackkk.push(tabPosition);
            } else {
                stackkk.push(tabPosition);
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            tabPositionUnselected = tab.getPosition();
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });
}
.

и в обратной стороне в активности,

//OnbackPress i have first taken out the last one as it already and
//selected by poping it out then only set to the pager.
@Override
public void onBackPressed() {
    if (stackkk.size() > 1) {
        stackkk.pop();
        mPager.setCurrentItem(stackkk.lastElement());
    } else {
    }
}
.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top