2013-04-15 1 views
1

В основном у меня есть FragmentActivity с выпадающим меню, которое, когда вы выбираете элемент из этого меню, делает мой частный класс, который расширяет фрагмент, чтобы показывать каждый раз, когда другие вещи на карте он сам Теперь проблема заключается в том, что, когда я сделать линию внутри класса фрагмента, который управляет картой:Как использовать mapfragment во фрагменте

GoogleMap map = ((MapFragment)getFragmentManager.findFragmentById(R.id.map)).getMap() 

это говорит вы не можете бросить фрагмент в MapFragment так я пытался продлить MapFragment для класса, но когда я выбираю элемент внутри выпадающее меню я делаю этот отрезок кода:

Fragment fragment = new MyFragmentClass()(); 
Bundle args = new Bundle(); 
args.putInt(PlacesFinder.ARG_SECTION_NUMBER, position + 1); 
fragment.setArguments(args); 
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit(); 

Я могу использовать только фрагмент, так как я могу использовать карту google внутри фрагмента, если я не могу найти его внутри класса фрагмента и не может расширять mapfragment из-за выпадающего меню?

Благодаря поднимитесь :)

+1

Проблема с пониманием вашего вопроса. Является ли проблема использованием «MapFragment» внутри фрагмента? – Rarw

+0

Проблема в том, что я хочу используйте объект GoogleMap внутри фрагмента, но мне нужно использовать MapFragment, потому что я получил фрагмент фрагмента: <фрагмент xmlns: android = "http://schemas.android.com/apk/res/android" android: ID = "@ + идентификатор/карта" андроид: layout_width = "match_parent" андроид: layout_height = "match_parent" андроид: имя = "com.google.android.gms.maps.MapFragment" /> , что я использую но я не знаю, как связать его внутри класса фрагмента с MapFragment – user2229196

ответ

0

Вы можете использовать GoogleMap внутри фрагмента. Рассматривая только часть вашего кода, которая создает фрагмент в XML, есть ошибки. Предполагая, что этот фрагмент является единственным элементом в макете XML это, как следует читать:

<fragment xmlns:android="schemas.android.com/apk/res/android" 
    android:id="@+id/map" 
    android:layout_width="match_parent"  
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.MapFragment"/> 

Последняя строка вашего XML, где у вас есть Android: имя неправильно. You код добавления карты в рамках деятельности должны работать

GoogleMap map = ((MapFragment)getFragmentManager.findFragmentById(R.id.map)).getMap(); 

Я использовал этот код, приведенный ниже, без проблем до

mapFrag = ((SupportMapFragment) getFragmenManager().findFragmenById(R.id.map)).getMap(); 

Единственное различие (1) Я использую SupportMapFragment; (2) Я объявил свой GoogleMap за пределами onCreate.

Это звучит так, основываясь на том, что вы описываете, когда фрагмент не может быть отнесен к правильному классу, что это проблема либо с ошибкой в ​​XML-фрагменте, либо вы не используете правильный импорт. Если вы используете MapFragment, вам необходимо убедиться, что вы используете импорт MapFragment (не SupportMapFragment или только Fragment).

Что касается последней части вашего кода, я не уверен, что такое отношения с выпадающим меню. Похоже, вы передаете аргументы фрагменту? Если вы можете предоставить более подробную информацию, я также прокомментирую это.

+0

Спасибо. Этот 'SupportMapFragment' сделал магию – Nizam

0

Извините за задержку, но это основной вид деятельности:

public class MainActivity extends FragmentActivity implements 
    ActionBar.OnNavigationListener , LocationListener{ 
    private String [] types; 
    private ActionBar actionBar; 

    public static GoogleMap map = null; 
    public static boolean googlePlayOn = false; 
    private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     types = getResources().getStringArray(R.array.values); 
     googlePlayOn = isGooglePlay(); 
     actionBar = getActionBar(); 
     actionBar.setDisplayShowTitleEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 

     // Set up the dropdown list navigation in the action bar. 
     actionBar.setListNavigationCallbacks(
     // Specify a SpinnerAdapter to populate the dropdown list. 
       new ArrayAdapter<String>(getActionBarThemedContextCompat(),android.R.layout.simple_list_item_1,android.R.id.text1, types), this); 
    } 

    /** 
    * This function checks in the phone operating system that 
    * the phone got google play services 
    * @return 
    */ 
    private boolean isGooglePlay() 
    { 
     int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 
     if(status == ConnectionResult.SUCCESS) 
      return true; 
     else 
      ((Dialog) GooglePlayServicesUtil.getErrorDialog(status, this, 10)).show(); 
     return false; 
    } 


    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
    private Context getActionBarThemedContextCompat() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
      return getActionBar().getThemedContext(); 
     } else { 
      return this; 
     } 
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     // Restore the previously serialized current dropdown position. 
     if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) { 
      getActionBar().setSelectedNavigationItem(
        savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM)); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     // Serialize the current dropdown position. 
     outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActionBar() 
       .getSelectedNavigationIndex()); 
    } 


    @Override 
    public boolean onNavigationItemSelected(int position, long id) { 
     // When the given dropdown item is selected, show its contents in the 
     // container view. 
     if(position != PlacesFinder.currentTitle) 
     { 
      if(!PlacesFinder.created) 
      { 
       PlacesFinder.created = true; 
       Bundle b = new Bundle(); 
       b.putInt(PlacesFinder.ARG_SECTION_NUMBER, position); 
       Fragment fragment = new PlacesFinder(); 
       fragment.setArguments(b); 
       getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit(); 
      } 
      PlacesFinder.newTitleBeenChosenHandler.sendEmptyMessage(0); 
     } 
     return true; 
    } 



    /** 
    * A dummy fragment representing a section of the app, but that simply 
    * displays dummy text. 
    */ 
    public static class PlacesFinder extends Fragment { 
     /** 
     * The fragment argument representing the section number for this 
     * fragment. 
     */ 
     public static boolean created = false; 
     public static final String ARG_SECTION_NUMBER = "section_number"; 
     public static Handler newTitleBeenChosenHandler; 
     public static int currentTitle = 0; 
     private Context context; 
     public PlacesFinder() { 
      this.context = getActivity(); 
      loadMapFragment(); 
     } 
     private void loadMapFragment() 
     { 
      if(googlePlayOn) 
      { 
       if(map == null) 
        map = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 

      } 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      return inflater.inflate(R.layout.places_fragment, container , false); 
     } 


    } 



    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onLocationChanged(Location location) { 
     // TODO Auto-generated method stub 

    } 

} 




This is the main xml file : 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" 
    tools:ignore="MergeRootFrame" /> 

Это файл MapFragment:

<?xml version="1.0" encoding="utf-8"?> 
<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/map" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:name="com.google.android.gms.maps.MapFragment"/> 

После того, как я сделать линию код карты = ((SupportMapFragment) getFragmentManager .() .findFragmentById (R.id.map)) GetMap();

что приложения не удается, и он говорит, что я получил нулевой указатель и я не имею ни малейшего понятия, почему ...

0

Вы должны использовать getSupportFragmentManager().

map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); 

Поскольку вы используете FragmentActivity, это должно работать.Я сталкиваюсь с той же проблемой, хотя я использую Фрагмент, и это не будет сделано :(