सबसे पहले, मुझे पता है कि इन विषयों को स्टैक ओवरफ्लो पर बहुत समय बनाया गया है, लेकिन मुझे मेरी समस्याओं का समाधान नहीं मिला है । दूसरा, मैं फ्रेंच हूं, इसलिए मेरी अंग्रेजी सही नहीं है, प्रतिदिन खेद है और मुझे बताओ कि क्या आप कुछ समझ नहीं पाएंगे। और इस परिचय को पूरा करने के लिए, यह पहली बार है कि मैं टुकड़ों से निपट रहा हूं, इसलिए, क्षमा करें अगर ऐसा कुछ है जिसे मैं अच्छी तरह समझ नहीं पा रहा हूं!टुकड़े से निपटना और पेजर देखना: निष्पादन के लिए खंड और रिकर्सिव एंट्री का टैग नहीं बदला जा सकता है ट्रांसपोर्टिंग
मेरे पास तीन बटन हैं, जो तीन टुकड़ों के बीच स्विच करने की अनुमति देते हैं। इन टुकड़ों में से एक के अंदर, मेरे पास दो टुकड़ों के साथ एक दृश्य पेजर है। इस पल के लिए, प्रत्येक टुकड़े (5 होते हैं), केवल एक टेक्स्ट व्यू होता है। मैं एंड्रॉइड-सपोर्ट-वी 4 के नवीनतम संस्करण का उपयोग कर रहा हूं (मैंने स्टैक ओवरफ्लो में बहुत सी विषय पढ़ा है जो कहता है कि समर्थन का नवीनतम संस्करण "मेरे पास निष्पादित करने के लिए रिकर्सिव एंट्री" को हल करता है)।
मेरे दो समस्याओं:
जब मैं एक बटन में दो बार क्लिक करें, मैं एक IllegaleStateException "टुकड़ा के टैग को बदल नहीं सकते" है। मैं बटन पर चयन पर एक नया टुकड़ा बनाकर इसे ठीक करने में सक्षम था, लेकिन मैं स्मृति कारणों और कार्यात्मक कारणों से हर बार खंड को फिर से बनाना नहीं चाहता हूं: खंड को उसके राज्य को रखना है। यह समस्या मेरी मुख्य समस्या नहीं है, वास्तव में, मुझे पता है कि जब उपयोगकर्ता पहले से ही खंड पर है, तो बटन को अक्षम करना संभव है, लेकिन यह प्रबंधन अजीब होना अजीब है जब यह प्रबंधन नहीं किया जाता है, नहीं?
जब मैं व्यू पेजर के साथ टुकड़े से बाहर जाता हूं, और मैं इस खंड में वापस जाता हूं, तो मेरे पास एक अवैध स्तर निष्पादन "निष्पादित करने के लिए रिकर्सिव प्रविष्टि" है। मैं अपने एडाप्टर को एक हैंडलर पर सेट करके ठीक कर सकता हूं, या FragmentPateAdapter के बजाय FragmentStatePagerAdapter का उपयोग कर सकता हूं (Display fragment viewpager within a fragment देखें), लेकिन यदि मेरा एप्लिकेशन क्रैश नहीं होता है, तो जब भी मैं दृश्य पेजर के साथ अपने टुकड़े पर वापस जाता हूं, तो दृश्य पेजर का अपमान होता है !
क्या आप मेरी मदद कर सकते हैं?
जावा स्रोत कोड बोले गए हैं, लेआउट स्रोत कोड है, मुझे लगता है, बेकार।
MainActivity:
public class MainActivity extends SherlockFragmentActivity{
private SherlockFragment fragmentOne, fragmentTwo, fragmentThree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// this.fragmentOne = new fragmentOne();
// this.fragmentTwo = new fragmentTwo();
// this.fragmentThree = new fragmentThree();
// Call new or instanciate ? What's the correct way ?
this.fragmentOne = (SherlockFragment) SherlockFragment.instantiate(this, FragmentOne.class.getName());
this.fragmentTwo = (SherlockFragment) SherlockFragment.instantiate(this, FragmentTwo.class.getName());
this.fragmentThree = (SherlockFragment) SherlockFragment.instantiate(this, FragmentThree.class.getName());
// Add fragment
FragmentTransaction transaction = (
this.getSupportFragmentManager().beginTransaction()
);
transaction.add(
R.id.tab_fragment,
this.fragmentOne,
this.fragmentOne.toString()
);
transaction.commit();
}
public void onButtonSelected(View v){
switch (v.getId()){
case R.id.button_one_tab:{
showFragment(this.fragmentThree);
break;
}
case R.id.button_two_tab:{
showFragment(this.fragmentOne);
break;
}
case R.id.button_three_tab:{
showFragment(this.fragmentTwo);
break;
}
default:{
break;
}
}
}
public void showFragment(SherlockFragment fragmentToShow){
FragmentTransaction transaction = (
this.getSupportFragmentManager().beginTransaction()
);
transaction.replace(R.id.tab_fragment, fragmentToShow, fragmentToShow.toString());
transaction.commit();
}
}
टुकड़ा दो और तीन ही एक ऐसा प्रतिरूप केवल एक TextView शामिल बढ़ा देते हैं। टुकड़ा एक (ध्यान दें कि मैं एक DirectionalViewPager उपयोग कर रहा हूँ - एक lib - एक ViewPager के बजाय):
public class FragmentOne extends SherlockFragment{
private FragmentOneAdapter fragmentOneAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Set up the pager
final DirectionalViewPager pager = (DirectionalViewPager)getActivity().findViewById(R.id.pager);
if (this.fragmentOneAdapter== null){
this.fragmentOneAdapter= new FragmentOneAdapter (getActivity().getSupportFragmentManager());
}
pager.setAdapter(fragmentOneAdapter);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_landing_page, container, false);
}
FragmentOneAdapter:
public class FragmentOneAdapter extends FragmentPagerAdapter{
private ArrayList<SherlockFragment> fragmentsList;
public FragmentOneAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
SherlockFragment fragmentFour = new FragmentFour();
SherlockFragment fragmentFive = new FragmentFive();
this.fragmentsList = new ArrayList<SherlockFragment>();
this.fragmentsList.add(fragmentFour);
this.fragmentsList.add(fragmentFive);
}
@Override
public Fragment getItem(int position) {
return this.fragmentsList.get(position);
}
@Override
public int getCount() {
return this.fragmentsList.size();
}
}
आपकी मदद के लिए अग्रिम प्रति धन्यवाद!
ओएमजी, मुझे महीनों के लिए एक समान समस्या थी, मैंने इसे ठीक करने में भी आशा खो दी, और यह इतना आसान था! –