5

v4パッケージでGoogle API 8(Android 2.2)を使用しています。私は多くの断片を入れて常に画面と少しコンテナ(でframeLayout)にとどまるメニューを持っているFragmentActivityを持ってフラグメント内のViewPagerがtransaction.remove()の後に表示されなくなる(インスタンスを維持する)

こんにちは、ここに私の問題です。私のアプリケーションは、フラグメントを隠して見せてもうまく動作しますが、使用するメモリが限られているため、すべてのフラグメントをロードした後にクラッシュします。この場合、他のアプリケーションをロードするときにフラグメントの一部を削除しなければならなかったので、アプリケーションはクラッシュしません。しかし、ここで別の問題が来る、私のポケベルは私がそれらを削除した後にリロードしない、他のすべての断片は正常に動作します。私のページャだけが表示されない、クラッシュしない、ただ消える。ここではあなたに私の問題が何であるかの手がかりを与えるためにいくつかのコードを行く:

MyFragmentActivity.javaは、このレイアウトを持っている:

<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> 

をそのでframeLayoutでは、私はすべての断片を置きます。ページャの断片は、それらの一つであり、そのレイアウトは次のようになります。

<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> 

そして私は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(); 

} 

これがどのように見える私のPagerAdapterを使用しています

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; 
    } 
} 

今、私の実装しようAbstractPagerFrag MENTは:

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(); 

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 
    } 
} 

さて、私はこのように私のコンテンツ(でframeLayout)(myFragmentがPagerFragmentで、mytagというは私によって定義され、そのタグを表す文字列である)から、それを追加します

そしてこれは、私はそれを削除する方法です:私はメニューにフラグメントに戻って移動した後、それは私が初めてで使用したのと同じ方法を使用して、再ロードする必要がある場合(コードabov

... 
transaction.remove(myFragment); 
... 

しかし、 e)、ページャはもう表示されません。誰でもこれを解決できますか?

これをすべて読んだら、ありがとう、あなたはチャンピオンです。

+0

私のために働く:http://stackoverflow.com/a/14505469/959086あなたのアプリケーションにこのコードを実装してみてください。 – Kenumir

答えて

0

実際に、フラグメントでViewPagerを実装する場合は、TabHost、TabWidget、FrameLayout、およびViewPagerを追加する必要があります。

TabHostは、タブ付きウィンドウビューのコンテナです。このオブジェクトには2つの子があります。ユーザーが特定のタブを選択するためにクリックするタブラベルのセットで、FrameLayoutはそのページのコンテンツを表示するオブジェクトです。そして、あなたはTabAdapterを(それがあなたのPagerAdapterのようなものである)を作成し、そしてmTabsAdapter.addTabを呼び出し、パラメータ

としてフラグメントを送信することにより、各タブの断片を追加する必要があります後、私は私がフラグメントを統合する方法を説明しpost about itし、作られましたおよびViewPager。それが役に立てば幸い。

+0

なぜTabHostを追加する必要がありますか?あなたの投稿は、それが必要な理由にはあまり入っていませんでした。 – Jeremy

関連する問題