2013-07-24 14 views
27

onResume()メソッドが呼び出されることはありません。だから、再開操作を処理するための良い方法はありますか?フラグメント切り替え中にonResume()の代わりに

+0

フラグメントを切り替えるとどういう意味ですか? – Desert

+0

例:アクティビティ 'A'はフラグメント 'X'をロードし、ボタンクリックはフラグメント 'X'を 'Y'に切り替えます。次に、フラグメント 'X'の 'onResume()'を押すと、呼び出されません。 – Manjunath

答えて

3

私は答えを見つけたと思います。フラグメントが可視になるたびに、フラグメントのonResume()を強制的に呼び出すリンクがあります。
Fragments onResume from back stack

2

あなたがページを選択すると、すべてのfragmentpublic方法を提供することにより、再開作業を行うことができ、私はあなたの例を与える:

public class MainActivity extends FragmentActivity { 
private TabHost mTabHost; 
private ViewPager mViewPager; 
private TabsAdapter mTabsAdapter; 

private ArrayList<Fragment> mFragments; 

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

    mTabHost = (TabHost) findViewById(android.R.id.tabhost); 
    mTabHost.setup(); 

    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mTabsAdapter = new TabsAdapter(this, mTabHost, mViewPager); 

    mFragments = new ArrayList<Fragment>(); 
    mFragments.add(new TestFragment1()); 
    mFragments.add(new TestFragment2()); 
    mFragments.add(new TestFragment3()); 

    mTabsAdapter.addTab(mTabHost.newTabSpec("fragment1").setIndicator("fragment1")); 
    mTabsAdapter.addTab(mTabHost.newTabSpec("fragment2").setIndicator("fragment2")); 
    mTabsAdapter.addTab(mTabHost.newTabSpec("fragment3").setIndicator("fragment3")); 

    if (savedInstanceState != null) { 
     mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("tab", mTabHost.getCurrentTabTag()); 
} 

private void refreshPage(int i) { 
    Fragment fragment = mFragments.get(i); 

    switch (i) { 
     case 0: 
      ((TestFragment1) fragment).refreshView(); 
      break; 
     case 1: 
      ((TestFragment2) fragment).refreshView(); 
      break; 
     case 2: 
      ((TestFragment3) fragment).refreshView(); 
      break; 
    } 
    } 

class TabsAdapter extends FragmentPagerAdapter implements TabHost.OnTabChangeListener, 
     ViewPager.OnPageChangeListener { 
    private final Context mContext; 
    private final TabHost mTabHost; 
    private final ViewPager mViewPager; 

    public TabsAdapter(FragmentActivity activity, TabHost tabHost, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     mContext = activity; 
     mTabHost = tabHost; 
     mViewPager = pager; 
     mTabHost.setOnTabChangedListener(this); 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(TabHost.TabSpec tabSpec) { 
     tabSpec.setContent(new DummyTabFactory(mContext)); 
     mTabHost.addTab(tabSpec); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public Fragment getItem(int i) { 
     return mFragments.get(i); 
    } 

    @Override 
    public void onPageScrolled(int i, float v, int i2) { 
    } 

    @Override 
    public void onPageSelected(int i) { 
     TabWidget widget = mTabHost.getTabWidget(); 
     int oldFocusability = widget.getDescendantFocusability(); 
     widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
     mTabHost.setCurrentTab(i); 
     widget.setDescendantFocusability(oldFocusability); 
     refreshPage(i); 
    } 

    @Override 
    public void onPageScrollStateChanged(int i) { 
    } 

    @Override 
    public void onTabChanged(String s) { 
     int postion = mTabHost.getCurrentTab(); 
     mViewPager.setCurrentItem(postion, true); 
    } 

    @Override 
    public int getCount() { 
     return mFragments.size(); 
    } 

    class DummyTabFactory implements TabHost.TabContentFactory { 
     private final Context mContext; 

     public DummyTabFactory(Context context) { 
      mContext = context; 
     } 

     @Override 
     public View createTabContent(String s) { 
      View v = new View(mContext); 
      v.setMinimumWidth(0); 
      v.setMinimumHeight(0); 
      return v; 
     } 
    } 
} 
} 

、その後、あなたはこのようなあなたのFragmentを書く:

public class TestFragment1 extends Fragment { 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.main, container, false); 
} 

public void refreshView() { 
    //do whatever you want 
} 
} 
39

コード:

手順:1

インタフェース作成:

public interface YourFragmentInterface { 
    void fragmentBecameVisible(); 
} 

ステップ:2

をsetOnPageChangeListenerでLISTNERを取り付け:

mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(final int position, final float v, final int i2) { 
     } 

     @Override 
     public void onPageSelected(final int position) { 
      YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, position); 
      if (fragment != null) { 
       fragment.fragmentBecameVisible(); 
      } 
     } 

     @Override 
     public void onPageScrollStateChanged(final int position) { 
     } 
    }); 

ステップ:3

あなたのフラグメントのインターフェイスを実装します。

public class yourActivity extends SherlockFragment implements YourFragmentInterface{ 
    @Override 
    public void fragmentBecameVisible() { 
      System.out.println("TestFragment"); 
    } 
} 

は、すべてのヨール断片の活性fragmentBecameVisible()にフラグメントの切り替え時に、このメソッドの呼び出しをこのLISTNERを実装します。

ありがとうございました。

+0

実際には YourFragmentInterface fragment =(YourFragmentInterface)mPagerAdapter.instantiateItem(mViewPager、position);を呼び出すことができます。 if(フラグメント!= null){ fragment.onResume(); } – Krit

+0

素晴らしいです、ありがとうございました。私はこの修正を探していた。 –

0

私は、フラグメントのオーバーライドメソッドを使用してこの問題を解決した:

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if (isVisibleToUser) { 
     if (getView() != null) { 
      // your code goes here 
     } 
    } 
} 

注:をonCreateView前に呼び出さViewpager最初のフラグメントsetUserVisibleHintでは、あなたがこれを処理する必要がありますので。

handle setUserVisibleHint called before onCreateView in Fragment

1

あなたはこれを試すことができ、

ステップ1:あなたの活動にTabselectedメソッドをオーバーライド

@Override 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    // When the given tab is selected, switch to the corresponding page in 
    // the ViewPager. 
    try { 
    if(MyEventsFragment!=null && tab.getPosition()==3) 
    { 
     MyEvents.fragmentChanged(); 
    } 
    } 
    catch (Exception e) 
    { 

    } 
    mViewPager.setCurrentItem(tab.getPosition()); 
} 

ステップ2:静的メソッドを使用して、あなたのフラグメントでやりたい、

public static void fragmentChanged() 
{ 
    Toast.makeText(actvity, "Fragment Changed", Toast.LENGTH_SHORT).show(); 
} 
0

各フラグメントのonResume()を単純にシミュレートできますインターフェイスを使って!

1- FragmentLifecycleという名前のインタフェースを作成し、コードは以下の通りである:

public interface FragmentLifecycle { 
    public void onResumeFragment(); 
} 

-2-各フラグメントは、インターフェイスを実装してみましょう:

public class FragmentOne extends Fragment implements FragmentLifecycle 

3-、各断片におけるインターフェイスメソッドを実装します。

@Override 
public void onResumeFragment() { 
    Log.i(TAG, "onResumeFragment()"); 
    Toast.makeText(getActivity(), "onResumeFragment():" + TAG,Toast.LENGTH_SHORT).show(); 
} 

ViewPagerページの呼び出しインターフェイスメソッド:

viewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 

      FragmentLifecycle fragmentToShow = (FragmentLifecycle)adapter.getItem(position); 
      fragmentToShow.onResumeFragment(); 
     } 
    }); 

お楽しみください!

+0

'onResumeFragment'は宣言されたときにpublicである必要はありません。申し訳ありません、nit picking :) –

+0

'adaper.getItem()'はシステムによって呼び出されるように設計されています。 'onResumeFragment'で' getView() 'を呼び出すと、nullが返されます。この回答を確認してください:https://stackoverflow.com/a/45276364/1065835 –

関連する問題