नवीनतम जानकारी:
मैंने अपनी समस्या को कम कर दिया है, जो मेरे टुकड़े टुकड़े करने वाले के साथ सिंक के बाहर होने वाले पुराने अंशों और मेरे दृष्टिकोण को बनाए रखने के टुकड़े के साथ एक समस्या है। इस मुद्दे को देखें ... http://code.google.com/p/android/issues/detail?id=19211#makechanges । मुझे अभी भी कोई सुराग नहीं है कि इसे कैसे हल किया जाए। कोई सुझाव...
मैंने लंबे समय तक इस पर बहस करने की कोशिश की है और किसी भी मदद की बहुत सराहना की जाएगी। मैं एक FragmentPagerAdapter का उपयोग कर रहा हूं जो टुकड़े की एक सूची को स्वीकार करता है जैसे:
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
...
new PagerAdapter(getSupportFragmentManager(), fragments);
कार्यान्वयन मानक है। मैं Fragments के लिए ActionBarSherlock और v4 कम्प्यूटेशनल लाइब्रेरी का उपयोग कर रहा हूं।
मेरी समस्या यह है कि ऐप को छोड़ने और कई अन्य एप्लिकेशन खोलने और वापस आने के बाद, टुकड़े फ़्रैगमेंटएक्टिविटी (यानी। getActivity() == null
) में अपना संदर्भ वापस खो देते हैं । मैं यह पता नहीं लगा सकता कि ऐसा क्यों हो रहा है। मैंने मैन्युअल रूप से सेट करने की कोशिश की setRetainInstance(true);
लेकिन यह मदद नहीं करता है। मुझे लगा कि ऐसा तब होता है जब मेरी FragmentActivity नष्ट हो जाती है, हालांकि यह तब भी होता है जब मैं लॉग संदेश प्राप्त करने से पहले ऐप खोल देता हूं। क्या कोई विचार हैं?
@Override
protected void onDestroy(){
Log.w(TAG, "DESTROYDESTROYDESTROYDESTROYDESTROYDESTROYDESTROY");
super.onDestroy();
}
एडॉप्टर:
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();
}
}
मेरा एक टुकड़ा छीन लिया, लेकिन मैं हर छीन लिया और अभी भी काम नहीं करता है ...
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);
}
}
}
अद्यतन विधि उस समय कहलाती है जब कोई उपयोगकर्ता किसी भिन्न टुकड़े के साथ सहभागिता करता है और getActivity अशक्त लौट रहा होता है। यहाँ विधि अन्य टुकड़ा कह रही है ...
((MyFragment) pagerAdapter.getItem(1)).update(id, name);
मेरा मानना है कि जब ऐप नष्ट हो जाता है तो ऐप को फिर से बनाने के बजाय केवल ऐप को डिफॉल्ट फ्रैगमेंट तक शुरू किया जाता है और फिर व्यूपेजर अंतिम ज्ञात पृष्ठ पर नेविगेट करता है। यह अजीब लगता है, क्या ऐप को केवल डिफ़ॉल्ट टुकड़े में लोड नहीं करना चाहिए?