Nell'applicazione che sto sviluppando sto usando un ViewPager con frammenti e ogni frammento costruisce il proprio menu indipendentemente da tutti gli altri frammenti nel ViewPager.Elementi di azione dal frammento iniziale di Viewpager non visualizzati
Il problema è che a volte i frammenti che sono stati inizializzati dal ViewPager per impostazione predefinita (vale a dire nel suo stato iniziale) non hanno i loro elementi popolati nel menu delle azioni. Quel che è peggio è che questo problema si verifica solo a intermittenza. Se faccio scorrere il ViewPager abbastanza in modo che i frammenti siano forzati a inizializzarli di nuovo, quando si scorre indietro, il menu viene popolato correttamente.
Codice attività:
package net.solarnz.apps.fragmentsample;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.support.v13.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
public class FragmentSampleActivity extends Activity {
private ViewPagerAdapter mViewPagerAdapter;
private ViewPager mViewPager;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (mViewPagerAdapter == null) {
mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager());
}
mViewPager = (ViewPager) findViewById(R.id.log_pager);
mViewPager.setAdapter(mViewPagerAdapter);
mViewPager.setCurrentItem(0);
}
private class ViewPagerAdapter extends FragmentStatePagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 8;
}
@Override
public Fragment getItem(int position) {
Fragment f = Fragment1.newInstance(position);
// f.setRetainInstance(true);
f.setHasOptionsMenu(true);
return f;
}
}
}
frammento di codice:
package net.solarnz.apps.fragmentsample;
import android.app.Fragment;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
public class Fragment1 extends Fragment {
int mNum;
static Fragment newInstance(int num) {
Fragment1 f = new Fragment1();
// Supply num input as an argument.
Bundle args = new Bundle();
args.putInt("num", num);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
mNum = getArguments() != null ? getArguments().getInt("num") : 0;
}
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_list, menu);
}
}
Disposizione:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<android.support.v4.view.ViewPager
android:id="@+id/log_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Menu:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_refresh"
android:title="Refresh"
android:icon="@android:drawable/ic_delete"
android:showAsAction="ifRoom|withText" />
</menu>
menu Azione essere popolato: http://i.stack.imgur.com/QFMDd.png
menu Azione non essere popolata: http://i.stack.imgur.com/sH5Pp.png
D'accordo con Solarnz sembra che non ci sia una soluzione ovvia. Ho creato un'applicazione [dimostratore] (https://github.com/snodnipper/page-flipper-race-condition/) che consente di riprodurre il problema in modo affidabile. Lo stesso problema sembra essere [riportato in ActionBarSherlock] (https://github.com/JakeWharton/ActionBarSherlock/issues/351) e ho sollevato questo [problema] (http://code.google.com/p/android/issues/detail? id = 29472) nel tracker dei problemi di Android. – snodnipper