EN SON BİLGİ:
Sorunumu, fragmentManager'ın eski parçaların örneklerini tutması ve görüntüleyicimin FragmentManager'ımla senkronize olmamasıyla ilgili bir sorun olarak daralttım. Bu soruna bakın ... http://code.google.com/p/android/issues/detail?id=19211#makechanges . Hala bunu nasıl çözeceğime dair hiçbir fikrim yok. Baska öneri...
Uzun süredir bu hatayı gidermeye çalıştım ve herhangi bir yardım çok takdir edilecektir. Şu şekilde parçaların listesini kabul eden bir FragmentPagerAdapter kullanıyorum:
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
...
new PagerAdapter(getSupportFragmentManager(), fragments);
Uygulama standarttır. Fragments için ActionBarSherlock ve v4 hesaplanabilirlik kitaplığını kullanıyorum.
Benim sorunum, uygulamadan çıktıktan ve diğer birkaç uygulamayı açtıktan ve geri döndükten sonra parçaların FragmentActivity'ye (yani getActivity() == null) referanslarını kaybetmeleridir . Bunun neden olduğunu anlayamıyorum. Manuel olarak ayarlamayı denedim setRetainInstance(true);ama bu yardımcı olmuyor. Bunun FragmentActivity'm yok edildiğinde olduğunu anladım, ancak günlük mesajını almadan uygulamayı açarsam bu yine de oluyor. Herhangi bir fikir var mı?
@Override
protected void onDestroy(){
Log.w(TAG, "DESTROYDESTROYDESTROYDESTROYDESTROYDESTROYDESTROY");
super.onDestroy();
}
Adaptör:
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();
}
}
Parçalarımdan biri soyuldu ama her şeyi sıyırdım ve hala çalışmıyor ...
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);
}
}
}
Güncelleme yöntemi, bir kullanıcı farklı bir parça ile etkileşim kurduğunda ve getActivity boş döndürdüğünde çağrılır. İşte diğer parçanın çağırdığı yöntem ...
((MyFragment) pagerAdapter.getItem(1)).update(id, name);
Uygulama yok edildiğinde ve ardından uygulamayı varsayılan parçaya kadar başlatmak yerine yeniden oluşturulduğunda uygulamanın başlatıldığına ve ardından görüntüleyicinin bilinen son sayfaya gittiğine inanıyorum. Bu garip görünüyor, uygulamanın sadece varsayılan parçaya yüklenmesi gerekmez mi?