5

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.

+0

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

Trả lời

0

Thực ra, nếu bạn muốn triển khai ViewPager với các đoạn, bạn nên thêm một TabHost, một TabWidget một FrameLayout và một ViewPager.

TabHost sẽ là vùng chứa cho chế độ xem cửa sổ theo thẻ. Đối tượng này chứa hai con: một bộ nhãn tab mà người dùng nhấp để chọn một tab cụ thể và FrameLayout là một đối tượng hiển thị nội dung của trang đó. Và sau khi bạn phải tạo một TabAdapter (có nghĩa là một cái gì đó giống như PagerAdapter của bạn), và thêm các mảnh vỡ cho mỗi tab bằng cách gọi mTabsAdapter.addTab và gửi Fragment như tham số

tôi đã thực hiện một post about it, nơi tôi giải thích làm thế nào để tích hợp Những mảnh vỡ và ViewPager. Hy vọng nó giúp.

+0

Tại sao bạn cần thêm một TabHost? Bài đăng của bạn không hoàn toàn đi vào lý do tại sao nó được yêu cầu. – Jeremy

Các vấn đề liên quan