W aplikacji, którą opracowuję, używam ViewPagera z fragmentami i każdy fragment tworzy własne menu niezależnie od wszystkich innych fragmentów w ViewPager.Elementy akcji z początkowego fragmentu Viewpagera nie są wyświetlane
Problem polega na tym, że czasami fragmenty zainicjowane domyślnie przez ViewPager (tj. W stanie początkowym) nie mają odpowiednich elementów w menu elementów akcji. Co gorsza, problem ten pojawia się tylko sporadycznie. Jeśli przeskoczę przez ViewPager na tyle, że fragmenty są zmuszone do ponownego zainicjowania ich samych, po przesunięciu do tyłu menu zapełnia się prawidłowo.
kod aktywny:
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;
}
}
}
fragment kodu:
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);
}
}
Układ:
<?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 Akcja jest wypełniana: http://i.stack.imgur.com/QFMDd.png
menu Akcja nie jest zaludniony: http://i.stack.imgur.com/sH5Pp.png
Zgadzam się z Solarnz wydaje się, że nie ma żadnego oczywistego rozwiązania. Stworzyłem aplikację [demonstrator] (https://github.com/sngariapper/page-flipper-race-condition/), która umożliwia niezawodne odtworzenie problemu. Ten sam problem wydaje się być [zgłoszony w ActionBarSherlock] (https://github.com/JakeWharton/ActionBarSherlock/issues/351) i podniosłem ten [problem] (http://code.google.com/p/android/issues/detail? id = 29472) w narzędziu do śledzenia błędów na Androidzie. – snodnipper