INFO TERBARU:
saya telah mempersempit masalah saya menjadi masalah dengan fragmentManager yang mempertahankan contoh fragmen lama dan viewpager saya tidak sinkron dengan FragmentManager saya. Lihat masalah ini ... http://code.google.com/p/android/issues/detail?id=19211#makechanges . Saya masih tidak tahu bagaimana menyelesaikan ini. Ada saran ...
Saya telah mencoba men-debug ini untuk waktu yang lama dan bantuan apa pun akan sangat kami hargai. Saya menggunakan FragmentPagerAdapter yang menerima daftar fragmen seperti ini:
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
...
new PagerAdapter(getSupportFragmentManager(), fragments);
Implementasinya standar. Saya menggunakan pustaka komputasi ActionBarSherlock dan v4 untuk Fragmen.
Masalah saya adalah bahwa setelah meninggalkan aplikasi dan membuka beberapa aplikasi lain dan kembali, fragmen kehilangan referensi kembali ke FragmentActivity (mis. getActivity() == null
). Saya tidak tahu mengapa ini terjadi. Saya mencoba mengatur secara manual setRetainInstance(true);
tetapi ini tidak membantu. Saya membayangkan bahwa ini terjadi ketika FragmentActivity saya dihancurkan, namun ini masih terjadi jika saya membuka aplikasi sebelum saya mendapatkan pesan log. Apakah ada ide?
@Override
protected void onDestroy(){
Log.w(TAG, "DESTROYDESTROYDESTROYDESTROYDESTROYDESTROYDESTROY");
super.onDestroy();
}
Adaptor:
public class PagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
Salah satu Fragmen saya dilucuti tetapi saya membayar semuanya itu dilucuti dan masih tidak berfungsi ...
public class MyFragment extends Fragment implements MyFragmentInterface, OnScrollListener {
...
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
handler = new Handler();
setHasOptionsMenu(true);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.w(TAG,"ATTACHATTACHATTACHATTACHATTACH");
context = activity;
if(context== null){
Log.e("IS NULL", "NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL");
}else{
Log.d("IS NOT NULL", "NOTNOTNOTNOTNOTNOTNOTNOT");
}
}
@Override
public void onActivityCreated(Bundle savedState) {
super.onActivityCreated(savedState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.my_fragment,container, false);
return v;
}
@Override
public void onResume(){
super.onResume();
}
private void callService(){
// do not call another service is already running
if(startLoad || !canSet) return;
// set flag
startLoad = true;
canSet = false;
// show the bottom spinner
addFooter();
Intent intent = new Intent(context, MyService.class);
intent.putExtra(MyService.STATUS_RECEIVER, resultReceiver);
context.startService(intent);
}
private ResultReceiver resultReceiver = new ResultReceiver(null) {
@Override
protected void onReceiveResult(int resultCode, final Bundle resultData) {
boolean isSet = false;
if(resultData!=null)
if(resultData.containsKey(MyService.STATUS_FINISHED_GET)){
if(resultData.getBoolean(MyService.STATUS_FINISHED_GET)){
removeFooter();
startLoad = false;
isSet = true;
}
}
switch(resultCode){
case MyService.STATUS_FINISHED:
stopSpinning();
break;
case SyncService.STATUS_RUNNING:
break;
case SyncService.STATUS_ERROR:
break;
}
}
};
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.activity, menu);
}
@Override
public void onPause(){
super.onPause();
}
public void onScroll(AbsListView arg0, int firstVisible, int visibleCount, int totalCount) {
boolean loadMore = /* maybe add a padding */
firstVisible + visibleCount >= totalCount;
boolean away = firstVisible+ visibleCount <= totalCount - visibleCount;
if(away){
// startLoad can now be set again
canSet = true;
}
if(loadMore)
}
public void onScrollStateChanged(AbsListView arg0, int state) {
switch(state){
case OnScrollListener.SCROLL_STATE_FLING:
adapter.setLoad(false);
lastState = OnScrollListener.SCROLL_STATE_FLING;
break;
case OnScrollListener.SCROLL_STATE_IDLE:
adapter.setLoad(true);
if(lastState == SCROLL_STATE_FLING){
// load the images on screen
}
lastState = OnScrollListener.SCROLL_STATE_IDLE;
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
adapter.setLoad(true);
if(lastState == SCROLL_STATE_FLING){
// load the images on screen
}
lastState = OnScrollListener.SCROLL_STATE_TOUCH_SCROLL;
break;
}
}
@Override
public void onDetach(){
super.onDetach();
if(this.adapter!=null)
this.adapter.clearContext();
Log.w(TAG, "DETACHEDDETACHEDDETACHEDDETACHEDDETACHEDDETACHED");
}
public void update(final int id, String name) {
if(name!=null){
getActivity().getSupportActionBar().setTitle(name);
}
}
}
Metode update dipanggil saat pengguna berinteraksi dengan fragmen berbeda dan getActivity menampilkan null. Inilah metode yang dipanggil oleh fragmen lain ...
((MyFragment) pagerAdapter.getItem(1)).update(id, name);
Saya percaya bahwa ketika aplikasi dihancurkan kemudian dibuat lagi alih-alih hanya memulai aplikasi ke fragmen default, aplikasi dimulai dan kemudian viewpager menavigasi ke halaman terakhir yang diketahui. Ini tampak aneh, bukankah seharusnya aplikasi memuat ke fragmen default?