Расширение представления с помощью Google Maps API v2 для Android

Пожалуйста помоги. Я пробовал и реализовывал все другие решения, но мне все равно не удалось интегрировать карты Google в свое приложение.

Текущая проблема находится в точке раздувания в моем фрагменте

05-21 00:17:24.629  26619-26619/com.wimedias12.orderr          E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable
    at com.google.android.gms.maps.GoogleMapOptions.createFromAttributes(Unknown Source)
    at com.google.android.gms.maps.SupportMapFragment.onInflate(Unknown Source)
    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:279)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:749)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
    at com.wimedias12.orderr.RestaurantFragments.RestaurantHomeFragment.onCreateView(RestaurantHomeFragment.java:66)

Первое, что появляется в качестве ответа, - это правильно сослаться на библиотеку сервисов Google, но это настройка.

Итак, вот моя текущая конфигурация, и, пожалуйста, помогите мне, если можете.

restaurant_home.xml — макет моего фрагмента, в котором я хочу отображать карту

... Other fragment layout XML code ...

<LinearLayout
android:layout_width="match_parent"
android:layout_height="200dp"
android:id="@+id/mapMap"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp">
<fragment
        android:id="@+id/mapMapppp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.SupportMapFragment" />

</LinearLayout>

... Rest of the fragment layout XML ... 

Я пробовал с MapView, но тоже не повезло, я читал, что использовать фрагмент проще.

RestaurantHomeFragment.java — код фрагмента

public class RestaurantHomeFragment extends SherlockFragment {
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.restaurant_home, container, false); //<-- This line breakes
 ....
}

Этот фрагмент размещается в SherlockFragmentActivity.

AndroidManifest.xml

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="14" />

    <permission android:name="com.wimedias12.orderr.MAPS_RECEIVE" android:protectionLevel="signature" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="com.wimedias12.orderr.MAPS_RECEIVE" />

    <uses-feature android:glEsVersion="0x00020000" android:required="true"/>

   <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.VPI" >
       <uses-library android:name="com.google.android.maps" />
....
<meta-data
           android:name="com.google.android.maps.v2.API_KEY"
           android:value="AIzaXxXxXXXxXxxXx-WHmjbRpFz4eOqWBXdqUtQ" />
   </application>

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

Буду признателен за любую оказанную помощь. Спасибо!

ОБНОВЛЕНИЕ:

Ответ @CommonsWare правильный. Но поскольку я использую Android Studio, то есть IntelliJ Idea, я чувствую, что должен ответить, как я заставляю его работать.

Я просто удалил все ссылки из окна «Структура проекта» и снова добавил одну за другой, и каким-то образом это сработало, конфигурация осталась такой же, как на изображении, показанном выше. Я предполагаю, что у IntelliJ были некоторые проблемы со ссылкой на библиотеку.

Так что правильная ссылка на библиотеку - это ответ.

P.S. В итоге я использовал MapView в SherlockFragment. Спасибо за помощь.


comment
Не могли бы вы дать подробный ответ для Android Studio/IntelliJ относительно NoClassDefFoundError? У меня та же проблема, и повторное добавление ссылок не помогло.   -  person rcell    schedule 16.07.2013


Ответы (2)


Похоже, вы используете Android Studio или IntelliJ IDEA, и я не могу это комментировать.

Однако ваша ошибка обычно связана с проектом, в который вы добавили JAR для сервисов Google Play, а не со всем проектом библиотеки Android. Ниже приведены инструкции по присоединению проекта библиотеки Android в Eclipse или из командной строки — вам нужно будет найти эквивалентные инструкции для выбранной вами IDE.

Также обратите внимание, что в настоящее время вы пытаетесь использовать фрагменты во фрагментах, заставляя RestaurantHomeFragment раздувать макет, содержащий SupportMapFragment. Это возможно сделать, но если у вас нет веских и четких причин для этого, я бы не стал, так как вложенные фрагменты добавляют сложности.

person CommonsWare    schedule 20.05.2013
comment
Да, мне тоже не нравятся вложенные фрагменты, но я попытался использовать MapView в своем фрагменте и столкнулся с другими проблемами. Могу ли я использовать MapView во фрагменте, отличном от карты? Можете ли вы показать мне пример такого использования? - person djandreski; 21.05.2013
comment
@djandreski: Могу ли я использовать MapView во фрагменте, отличном от карты? - вот почему они сделали это доступным. Можете ли вы показать мне пример такого использования? -- Я написал только примеры, в которых используется SupportMapFragment, извините. - person CommonsWare; 21.05.2013
comment
может ли это быть проблема с неправильным ключом API, я могу попытаться восстановить его, или есть другое исключение для такого рода ошибок. - person djandreski; 21.05.2013
comment
@djandreski: это может быть проблема с неправильным ключом API - нет. Пожалуйста, перечитайте второй абзац моего ответа. - person CommonsWare; 21.05.2013

Почему бы вам не попробовать что-то вроде этого:

public class MainActivity extends FragmentActivity {

private GoogleMap map;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); <--This line..I dont see why would you inflate it, like you did

    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    map.setMyLocationEnabled(true);
}
person SteBra    schedule 20.05.2013
comment
Я попытаюсь раздуть макет в действии, но я просто хотел работать с фрагментами из-за их возможности повторного использования. - person djandreski; 21.05.2013