onResume()
メソッドが呼び出されることはありません。だから、再開操作を処理するための良い方法はありますか?フラグメント切り替え中にonResume()の代わりに
答えて
私は答えを見つけたと思います。フラグメントが可視になるたびに、フラグメントのonResume()
を強制的に呼び出すリンクがあります。
Fragments onResume from back stack
あなたがページを選択すると、すべてのfragment
にpublic
方法を提供することにより、再開作業を行うことができ、私はあなたの例を与える:
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
}
}
コード:
手順: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を実装します。
ありがとうございました。
実際には YourFragmentInterface fragment =(YourFragmentInterface)mPagerAdapter.instantiateItem(mViewPager、position);を呼び出すことができます。 if(フラグメント!= null){ fragment.onResume(); } – Krit
素晴らしいです、ありがとうございました。私はこの修正を探していた。 –
私は、フラグメントのオーバーライドメソッドを使用してこの問題を解決した:
@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:あなたの活動に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();
}
各フラグメントの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();
}
});
お楽しみください!
'onResumeFragment'は宣言されたときにpublicである必要はありません。申し訳ありません、nit picking :) –
'adaper.getItem()'はシステムによって呼び出されるように設計されています。 'onResumeFragment'で' getView() 'を呼び出すと、nullが返されます。この回答を確認してください:https://stackoverflow.com/a/45276364/1065835 –
- 1. オフの代わりにオンに切り替えるボタン
- 2. eBay-apiでfindItemsAdvancedの代わりにGetSingleItemに切り替える
- 3. onclick中にフラグメントを切り替える方法は?
- 4. ドロップダウンパンニングAndroidのフラグメントの切り替え
- 5. 切り替え後のフラグメントのロック
- 6. Android:最適化フラグメントの切り替え
- 7. タブ内のフラグメントを切り替える
- 8. フラグメント間の切り替え方法
- 9. svcモードの代わりにu-bootをハイパーバイザモードに切り替える方法
- 10. フラグメントからフラグメントに切り替えるonClick()
- 11. MapViewでフラグメント間を切り替える
- 12. フラグメントをプログラムで切り替える
- 13. アニメーション中にブロックリンクを切り替える
- 14. フラグメントのこのオプションメニューをアクティビティに切り替えるには
- 15. 他のビューの切り替えに切り替えるapp xcode
- 16. フラグメントの切り替え中にカメラを操作する方法は?
- 17. フラグメント内のonClickListenerを持つフラグメント間の切り替え
- 18. マップフラグメントから別のフラグメントへの切り替えフラグメントとバック
- 19. Android:3GとWIFIの切り替えはアプリの途中で切り替える=ネットワーク接続が失われる
- 20. リサイクラビューがフラグメントを切り替えるときにnullになる
- 21. 同じアクティビティの2つのフラグメントに切り替える方法
- 22. フラグメントを前後に切り替えた後のRecyclerviewのAndroid Nullpointerexception
- 23. 私はフラグメントを別のフラグメントに切り替えるとランダムにクラッシュします
- 24. viewpagerでフラグメントとフラグメントを切り替える
- 25. フラグメントの代わりにMainActivityのSwitch.setOnCheckedChangeListener
- 26. アクティビティの切り替え中にBLEデバイスが切断される
- 27. フラグメントをcardviewで切り替えるには
- 28. フラグメントを切り替える際にエラーが発生します
- 29. フラグメントを高速に切り替えると、アプリがクラッシュする
- 30. 切り替え
フラグメントを切り替えるとどういう意味ですか? – Desert
例:アクティビティ 'A'はフラグメント 'X'をロードし、ボタンクリックはフラグメント 'X'を 'Y'に切り替えます。次に、フラグメント 'X'の 'onResume()'を押すと、呼び出されません。 – Manjunath