Tôi đang sử dụng API Google 8 (Android 2.2) với gói v4.ViewPager bên trong Fragment biến mất sau transaction.remove() (Duy trì cá thể?)
Hi, đây là vấn đề của tôi:
Tôi có một FragmentActivity rằng có một thực đơn những người luôn luôn ở lại trên màn hình và một chút container (một FrameLayout), nơi một tôi đặt nhiều mảnh. Ứng dụng của tôi hoạt động tốt khi tôi đang ẩn và hiển thị các đoạn nhưng nó bị treo sau khi tôi tải tất cả các mảnh vì tôi có bộ nhớ hạn chế để sử dụng. Trong trường hợp này, tôi phải loại bỏ một số mảnh khi tải những phần khác, vì vậy ứng dụng không bị lỗi. Nhưng ở đây có một vấn đề khác, máy nhắn tin của tôi không tải lại sau khi tôi gỡ bỏ chúng, tất cả các mảnh khác hoạt động tốt. Chỉ máy nhắn tin của tôi không hiển thị, chúng không bị hỏng, chỉ biến mất. Ở đây đi một số mã để cung cấp cho bạn một đầu mối về những gì vấn đề của tôi là về:
MyFragmentActivity.java có bố trí này:
<LinearLayout
...(some code from menu that doesn't matter)
<FrameLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</LinearLayout>
Trong FrameLayout đó, tôi đặt tất cả các mảnh vỡ của tôi. Các mảnh vỡ máy nhắn tin là một trong số họ và bố trí của nó trông giống như:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+android:id/some_pager"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
Và tôi thực hiện lớp trừu tượng này AbstractPagerFragment:
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public abstract class AbstractPagerFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View fragment = inflater.inflate(getLayoutID(), container,false);
PagerAdapter mPagerAdapter = initializePager();
ViewPager pager = (ViewPager) fragment.findViewById(getPagerID());
pager.setAdapter(mPagerAdapter);
return fragment;
}
private PagerAdapter initializePager() {
PagerAdapter mPagerAdapter = new templateDigital.util.PagerAdapter(getFragmentManager(), getFragments());
return mPagerAdapter;
}
public abstract List<Fragment> getFragments();
public abstract int getLayoutID();
public abstract int getPagerID();
}
này sử dụng tôi PagerAdapter trông giống như:
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class PagerAdapter extends FragmentPagerAdapter{
private List<Fragment> fragments;
public PagerAdapter(FragmentManager fManager, List<Fragment> fragments) {
super(fManager);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
Bây giờ, hãy triển khai AbstractPagerFrag của tôi ment:
import templateDigital.main.R;
import templateDigital.util.fragments.AbstractPagerFragment;
import templateDigital.util.fragments.GenericFragment;
import android.support.v4.app.Fragment;
public class ConcretePagerFragment extends AbstractPagerFragment {
private List<Fragment> fragments;
public ConcretePagerFragment() {
fragments = new ArrayList<Fragment>();
fragments.add(new GenericFragment(R.layout.concept_page1_fragment));
fragments.add(new GenericFragment(R.layout.concept_page2_fragment));
fragments.add(new GenericFragment(R.layout.concept_page3_fragment));
//GenericFragments is a class that extends Fragments and just inflate a layout with a background image.
}
@Override
public List<Fragment> getFragments() {
return fragments;
}
@Override
public int getLayoutID() {
return R.layout.pager_fragment;
}
@Override
public int getPagerID() {
return R.id.some_pager; // the pager inside the layout
}
}
Được rồi, bây giờ tôi thêm nó từ nội dung của tôi (FrameLayout) như thế này (myFragment là một PagerFragment, và myTag là một chuỗi đại diện cho thẻ của nó được xác định bởi tôi):
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (fragmentManager.findFragmentByTag(myTag) == null) {
transaction.add(R.id.content,myFragment, myTag);
}
transaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
hideAllOtherFragments(myTag, transaction); //Here I hide all other fragments, the code is okay. Trust me.
transaction.show(myFragment());
transaction.commit();
Và đây là cách tôi loại bỏ nó:
...
transaction.remove(myFragment);
...
Nhưng khi nó nên tải một lần nữa sau khi tôi điều hướng trở lại đoạn trong menu, sử dụng cùng một phương pháp tôi đã sử dụng trong thời gian đầu tiên (mã abov e), máy nhắn tin không hiển thị nữa. Bất cứ ai có thể giải quyết điều này?
Nếu bạn đọc tất cả điều này, cảm ơn bạn, bạn là nhà vô địch.
Công việc đó cho tôi: http://stackoverflow.com/a/14505469/959086 thử triển khai mã này trong ứng dụng của bạn – Kenumir