8

मैं एक ऐप बनाने की कोशिश कर रहा हूं जो एक्शन बार टैब को लागू करेगा। टैब में से एक में MapFragment होना चाहिए।एक्शन बार टैब में मैपफ्रैगमेंट

मैं टैब के साथ एक एक्शन बार कैसे कार्यान्वित कर सकता हूं, जिसमें से एक नक्शा टुकड़ा है?

क्या आप इस के साथ आगे बढ़ने के तरीके में मेरी सहायता कर सकते हैं?

यहाँ मैं अब तक है:

मुख्य वर्ग

package com.nfc.demo; 

import android.app.ActionBar; 
import android.app.ActionBar.Tab; 
import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 

public class NFCDemoActivity extends Activity { 

    Tab selectedTab = null; 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ActionBar bar = getActionBar(); 
    bar.setDisplayShowHomeEnabled(false); 
    bar.setDisplayShowTitleEnabled(false); 

    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    bar.setCustomView(R.layout.main); 

    ActionBar.Tab mapTab = bar.newTab().setText("Map"); 
    ActionBar.Tab settingsTab = bar.newTab().setText("Settings"); 
    ActionBar.Tab aboutTab = bar.newTab().setText("About"); 

    MapFragment mapFragment = new MapFragment(); 
    SettingsFragment settingsFragment = new SettingsFragment(); 
    AboutFragment aboutFragment = new AboutFragment(); 

    mapTab.setTabListener(new TabListener(mapFragment)); 
    settingsTab.setTabListener(new TabListener(settingsFragment)); 
    aboutTab.setTabListener(new TabListener(aboutFragment)); 

    Tab selectedTab = (Tab) getLastNonConfigurationInstance(); 

    if (selectedTab == null) { 
     bar.addTab(mapTab, false); 
     bar.addTab(settingsTab, false); 
     bar.addTab(aboutTab, true); 
    } 

    setContentView(R.layout.main); 

    } 

    public Object onRetainNonConfigurationInstance() { 
    return selectedTab; 
    } 

    protected boolean isRouteDisplayed() { 
     return false; 
    } 

    protected class TabListener implements ActionBar.TabListener { 
    private Fragment fragment; 

    public TabListener(Fragment fragment) { 
     this.fragment = fragment; 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction fragmentTransaction) { 
     fragmentTransaction.replace(R.id.mainFragment, this.fragment, null); 
     selectedTab = tab; 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction fragmentTransaction) { 
     fragmentTransaction.remove(this.fragment); 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction fragmentTransaction) { 
     //do nothing 
    } 
    } 
} 

टुकड़ा वर्गों सब सिर्फ एक .xml लेआउट के साथ एक inflater लौट रहे हैं।

एक्सएमएल लेआउट:

main.xml (मानचित्र इस एक्सएमएल फ़ाइल पर होना चाहिए)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/mainFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

</LinearLayout> 

settings.xml और about.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/textView123" 
     android:text="asdfg" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

मैं करने की कोशिश कर रहा है पता लगाएं कि कुछ दिनों तक कैसे आगे बढ़ना है, लेकिन मैं वास्तव में उलझन में हूं। किसी भी मदद/सुझावों की सराहना की जाएगी।

इसके अलावा, getLastNonConfigurationInstance() के बारे में क्या? यह बहिष्कृत है।

+0

माफ करना, मैंने सोचा था कि मेरे सवाल था स्पष्ट। मैंने इसे संपादित किया, लेकिन अगर मुझे और सुधार की आवश्यकता है तो मुझे बताएं। – hermann

+0

अच्छा, आपका समग्र प्रश्न स्पष्ट है, लेकिन फिर आप हमें कोड का एक गुच्छा सौंपते हैं और यह नहीं बताते कि उस कोड के साथ समस्या क्या है। एक एक्शन बार टैब में 'MapFragment' होने के बाद कोई अन्य खंड एक एक्शन बार टैब में होने से अलग नहीं है। – CommonsWare

+0

मुझे यह पता लगाना प्रतीत नहीं होता कि यह कैसे करना है, हालांकि। बाइनरी एक्सएमएल फ़ाइल लाइन # 2:: दूसरे के साथ आईडी 0x7f040005, टैग अशक्त, या पैरेंट आईडी 0x1020002 डुप्लिकेट एक बार मैं main.xml में परिवर्तन और एक टुकड़ा जोड़ने मैं एक 'त्रुटि बढ़ा-चढ़ाकर वर्ग fragment' त्रुटि' java.lang.IllegalArgumentException की वजह से मिलता है com.google.android.gms.maps.MapFragment 12-28 21: 14: 07.9 9 1: ई/एंड्रॉइड रनटाइम (2618 9): \t atroid.app.Activity.onCreateView (Activity.java:4722) ' – hermann

उत्तर

16

निम्न समाधान में, एक एक्शन बार टैब/ड्रॉपडाउन में GoogleMap जोड़ना संभव है। ऐसा करने की कुंजी एक्शन बार में दूसरे खंड में स्विच करते समय मैपफ्रैगमेंट को नष्ट करने के लिए सही ढंग से अपना टुकड़ा स्थापित करने में निहित है।

  1. ग्रहण में एक परियोजना मुख्य गतिविधि के लिए टैब्स का उपयोग करता है बनाएँ:

    एक गतिविधि है कि कार्यवाही बार कार्यक्षमता लागू करता है बनाएँ। यदि आप ऐसा नहीं करते हैं, तो चरण 2-5 पर जाएं।

  2. Activity को बढ़ाकर एक वर्ग बनाएं और ActionBar.OnNavigationListener लागू करता है।
  3. एक लेआउट एक्सएमएल फ़ाइल बनाएं जो आपके टैब टुकड़ों के लिए एक कंटेनर है जब आप उनके बीच स्विच करते हैं।
  4. अपनी गतिविधि कक्षा में निम्न विधि को लागू/ओवरराइड करें: public boolean onNavigationItemSelected(int position, long id)
  5. इस विधि में, चयनित टैब निर्धारित करने के लिए position ऑब्जेक्ट के बीच स्विच करें और इस तरह FragmentManager का उपयोग करके खंड को एक नए उदाहरण में सेट करें: getFragmentManager().beginTransaction().replace(R.id.container, fragment).commit()

    1. एक वर्ग है कि Fragment फैली अपने टैब के टुकड़ा के रूप में उपयोग करने के लिए बनाएँ:

    एक टुकड़ा है कि नक्शे रखती है बनाएँ।MapFragment को बेहतर ढंग से समझने के लिए [1] पढ़ें।

  6. कि एक टुकड़ा तत्व ([1] के रूप में देखा) शामिल हैं एक लेआउट एक्सएमएल फ़ाइल बनाएँ। एक लेआउट एक्सएमएल फ़ाइल बनाते हैं और अपने टुकड़ा कक्षा में इसका इस्तेमाल करने की है कि पेज में XML का उपयोग करें।
  7. onCreateView अधिभावी द्वारा अपने टुकड़ा कक्षा में है कि लेआउट एक्सएमएल फ़ाइल फुलाना।
  8. आपका एप्लिकेशन अब,, टैब आपके टुकड़ा वर्ग का उपयोग करता है में एक नक्शा प्रदर्शित करना चाहिए लेकिन एक और टैब पर स्विच करने और वापस नक्शा टैब में एक नकली दृश्य आईडी परिणाम देगा। इसे दूर करने के लिए, अगले चरण पर जाएं।
  9. अपने टुकड़ा कक्षा में, निम्न विधि विशेष रूप से अंतर्निहित GoogleMap वस्तु को नष्ट करने के ओवरराइड इतना है कि यह निर्मित किया जा सकता है जब नक्शा टैब आपके टुकड़ा फिर से वर्ग को लोड करता है:

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     MapFragment f = (MapFragment) getFragmentManager().findFragmentById(R.id.map); 
     if (f != null) 
      getFragmentManager().beginTransaction().remove(f).commit(); 
    } 
+0

धन्यवाद! onDestroyView मेरे कोड की आवश्यकता है :-) – sourcerebels

+1

अब मैं इसका उपयोग कर रहा हूं: अगर (f! = null && f.isResumed()) या मुझे अपने ऐप को वापस बटन दबाकर अपवाद प्राप्त हो रहा है। स्व-परीक्षा – sourcerebels

+1

इस काम करता है, लेकिन अगर मैं अपने स्क्रीन बारी बारी से, इस अपवाद के साथ मेरी ऐप्लिकेशन क्रैश: java.lang.IllegalStateException: की वजह से onSaveInstanceState – jramoyo

-1

सुनिश्चित नहीं है कि आपने इसे पहले ही हल किया है या नहीं। आपको इसे बनाने के लिए लाइब्रेरी प्रोजेक्ट के रूप में Google play सेवाएं जोड़नी होंगी। सबसे पहले मैंने जार फ़ाइल जोड़ने की कोशिश की, लेकिन यह काम नहीं किया।

+0

अगर Google खेल सेवाएं ठीक से स्थापित नहीं होती हैं आपका नक्शा लोड नहीं होगा। –