Tôi đã có một hoạt động ban đầu lưu trữ một ViewPager, nối với FragmentPagerAdapter.Thay thế ViewPager bằng Fragment - Sau đó điều hướng Quay lại
Khi người dùng nhấp vào một mục bên trong đoạn con của ViewPager, tôi đang sử dụng FragmentTransaction để thay thế chế độ xem vùng chứa trống bằng Phân đoạn mới mà tôi muốn điều hướng đến.
Nếu tôi sử dụng addToBackStack() trên giao dịch, cam kết giao dịch và sau đó điều hướng trở lại, tôi không được trả về chế độ xem của ViewPager (bố cục ban đầu).
Nếu tôi không sử dụng addToBackStack() trên giao dịch, hãy cam kết giao dịch và sau đó điều hướng trở lại, ứng dụng sẽ thoát.
Có vẻ như rằng ViewPager không được thêm vào backstack (điều này không có gì đáng ngạc nhiên vì nó không phải là một phần của nó) .. Nhưng tôi mong đợi hành vi mặc định sẽ là báo chí quay lại đưa tôi trở lại cho hoạt động đó Chế độ xem ban đầu (ViewPager).
Dựa trên những gì tôi đã đọc, có vẻ như có lẽ do một giao dịch phân đoạn đang diễn ra, ViewPager hoặc PagerAdapter mất dấu vết phân đoạn nào sẽ được hiển thị.
Tôi thực sự bối rối với điều này, nhưng cuối cùng tôi đã tạo ra một mớ hỗn độn mã lớn ghi đè onBackPress và hiển thị và ẩn chế độ xem chế độ xem. Tôi đã nghĩ rằng có một cách đơn giản hơn để sử dụng các hành vi mặc định để thực hiện điều hướng thích hợp.
tl; dr
A là tập hợp lưu trữ Viewpager. B là một phân đoạn mới.
Khi tôi thay thế A bằng B, sau đó nhấn lại, tôi mong đợi điều hướng trở lại A, nhưng điều đó không xảy ra.
Mọi lời khuyên sẽ được đánh giá cao.
Code:
MainActivity:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
headingLayout = (RelativeLayout) findViewById(R.id.headingLayout);
headingLayout.setVisibility(View.GONE);
// Set up the ViewPager, attaching the adapter and setting up a listener
// for when the
// user swipes between sections.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setPageMargin(8);
/** Getting fragment manager */
FragmentManager fm = getSupportFragmentManager();
/** Instantiating FragmentPagerAdapter */
MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);
/** Setting the pagerAdapter to the pager object */
mViewPager.setAdapter(pagerAdapter);
.
.
.
}
public void onListItemClicked(Fragment fragment) {
fromPlayer = false;
InitiateTransaction(fragment, true);
}
public void InitiateTransaction(Fragment fragment, boolean addToBackStack) {
invalidateOptionsMenu();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragmentContainer, fragment).addToBackStack(null)
.commit();
}
PagerAdapter:
package another.music.player;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import another.music.player.fragments.AlbumListFragment;
import another.music.player.fragments.ArtistListFragment;
import another.music.player.fragments.SongListFragment;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
final int PAGE_COUNT = 3;
/** Constructor of the class */
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
ArtistListFragment artistListFragment = new ArtistListFragment();
Bundle artistData = new Bundle();
artistData.putInt("current_page", i + 1);
artistListFragment.setArguments(artistData);
return artistListFragment;
case 1:
AlbumListFragment albumListFragment = new AlbumListFragment();
Bundle albumData = new Bundle();
albumData.putInt("current_page", i + 1);
albumData.putBoolean("showHeader", false);
albumListFragment.setArguments(albumData);
return albumListFragment;
default:
SongListFragment songListFragment = new SongListFragment();
Bundle songData = new Bundle();
songData.putInt("current_page", i + 1);
songListFragment.setArguments(songData);
return songListFragment;
}
}
/** Returns the number of pages */
@Override
public int getCount() {
return PAGE_COUNT;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Artists";
case 1:
return "Albums";
default:
return "Songs";
}
}
}
xml chính (chứa fragmentContainer & ViewPager):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/app_background_ics" >
<RelativeLayout
android:id="@+id/headingLayout"
android:layout_width="match_parent"
android:layout_height="56dp" >
</RelativeLayout>
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/headingLayout" />
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<android.support.v4.view.PagerTabStrip
android:id="@+id/pager_title_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#33b5e5"
android:paddingBottom="4dp"
android:paddingTop="4dp"
android:textColor="#fff" />
</android.support.v4.view.ViewPager>
</RelativeLayout>
YES! Cảm ơn bạn. –