2012-12-29 3 views
5

버전 2 API를 사용하여 Google지도보기를 기본 Android 구성 세부 정보 흐름에 추가하려고합니다.Android 세부 정보 흐름에지도 v2 API 추가 - 클래스 조각을 부 풀리는 중 오류가 발생했습니다.

package com.reading.trackitparent; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import com.reading.trackitparent.dummy.DummyContent; 

/** 
* A fragment representing a single Item detail screen. This fragment is either 
* contained in a {@link ItemListActivity} in two-pane mode (on tablets) or a 
* {@link ItemDetailActivity} on handsets. 
*/ 
public class MapDetailFragment extends Fragment { 
    /** 
    * The fragment argument representing the item ID that this fragment 
    * represents. 
    */ 
    public static final String ARG_ITEM_ID = "item_id"; 

    /** 
    * The dummy content this fragment is presenting. 
    */ 
    private DummyContent.DummyItem mItem; 

    /** 
    * Mandatory empty constructor for the fragment manager to instantiate the 
    * fragment (e.g. upon screen orientation changes). 
    */ 
    public MapDetailFragment() { 
    } 

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

     if (getArguments().containsKey(ARG_ITEM_ID)) { 
      // Load the dummy content specified by the fragment 
      // arguments. In a real-world scenario, use a Loader 
      // to load content from a content provider. 
      mItem = DummyContent.ITEM_MAP.get(getArguments().getString(
        ARG_ITEM_ID)); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_map_detail, 
       container, false); 

//  // Show the dummy content as text in a TextView. 
//  if (mItem != null) { 
//   ((TextView) rootView.findViewById(R.id.item_detail)) 
//     .setText(mItem.content); 
//  } 

     return rootView; 
    } 
} 

와 나는 다음과 같은 레이아웃을 사용하는 것을 시도하고있다 :

<RelativeLayout 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" 
    tools:context=".ItemDetailActivity" > 

    <fragment 
     xmlns:android="http://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" /> 

</RelativeLayout> 
을 나는 새로운 MapDetailFragment을 만든

12-29 22:47:05.828: E/AndroidRuntime(1655): FATAL EXCEPTION: main 
12-29 22:47:05.828: E/AndroidRuntime(1655): android.view.InflateException: Binary XML file line #48: Error inflating class fragment 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:739) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at com.reading.trackitparent.MapDetailFragment.onCreateView(MapDetailFragment.java:52) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.os.Handler.handleCallback(Handler.java:605) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.os.Handler.dispatchMessage(Handler.java:92) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.os.Looper.loop(Looper.java:137) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at java.lang.reflect.Method.invoke(Method.java:511) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at dalvik.system.NativeStart.main(Native Method) 
12-29 22:47:05.828: E/AndroidRuntime(1655): Caused by: java.lang.ClassCastException: com.google.android.gms.maps.MapFragment cannot be cast to android.support.v4.app.Fragment 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.support.v4.app.Fragment.instantiate(Fragment.java:394) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.support.v4.app.Fragment.instantiate(Fragment.java:369) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:272) 
12-29 22:47:05.828: E/AndroidRuntime(1655):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:669) 

: 어떤 이유로 나는 오류 팽창 클래스 단편 예외를 얻고있다

항목 목록 작업 :

package com.reading.trackitparent; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 

/** 
* An activity representing a list of Items. This activity has different 
* presentations for handset and tablet-size devices. On handsets, the activity 
* presents a list of items, which when touched, lead to a 
* {@link ItemDetailActivity} representing item details. On tablets, the 
* activity presents the list of items and item details side-by-side using two 
* vertical panes. 
* <p> 
* The activity makes heavy use of fragments. The list of items is a 
* {@link ItemListFragment} and the item details (if present) is a 
* {@link ItemDetailFragment}. 
* <p> 
* This activity also implements the required {@link ItemListFragment.Callbacks} 
* interface to listen for item selections. 
*/ 
public class ItemListActivity extends FragmentActivity implements 
     ItemListFragment.Callbacks { 

    /** 
    * Whether or not the activity is in two-pane mode, i.e. running on a tablet 
    * device. 
    */ 
    private boolean mTwoPane; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_item_list); 

     if (findViewById(R.id.item_detail_container) != null) { 
      // The detail container view will be present only in the 
      // large-screen layouts (res/values-large and 
      // res/values-sw600dp). If this view is present, then the 
      // activity should be in two-pane mode. 
      mTwoPane = true; 

      // In two-pane mode, list items should be given the 
      // 'activated' state when touched. 
      ((ItemListFragment) getSupportFragmentManager().findFragmentById(
        R.id.item_list)).setActivateOnItemClick(true); 
     } 

     // TODO: If exposing deep links into your app, handle intents here. 
    } 

    /** 
    * Callback method from {@link ItemListFragment.Callbacks} indicating that 
    * the item with the given ID was selected. 
    */ 
    @Override 
    public void onItemSelected(String id) { 
     if (mTwoPane) { 
      // In two-pane mode, show the detail view in this activity by 
      // adding or replacing the detail fragment using a 
      // fragment transaction. 
      Bundle arguments = new Bundle(); 
      arguments.putString(MapDetailFragment.ARG_ITEM_ID, id); 
      MapDetailFragment fragment = new MapDetailFragment(); 
      fragment.setArguments(arguments); 
      getSupportFragmentManager().beginTransaction() 
        .replace(R.id.item_detail_container, fragment).commit(); 

     } else { 
      // In single-pane mode, simply start the detail activity 
      // for the selected item ID. 
      Intent detailIntent = new Intent(this, ItemDetailActivity.class); 
      detailIntent.putExtra(MapDetailFragment.ARG_ITEM_ID, id); 
      startActivity(detailIntent); 
     } 
    } 
} 

Google Play 서비스 라이브러리를 참조했습니다. 내 매니페스트는 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.reading.trackitparent" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <permission 
     android:name="com.reading.trackitparent.permission.MAPS_RECEIVE" 
     android:protectionLevel="signature" /> 

    <uses-permission android:name="com.reading.trackitparent.permission.permission.MAPS_RECEIVE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

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

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.reading.trackitparent.ItemListActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name="com.reading.trackitparent.ItemDetailActivity" 
      android:label="@string/title_item_detail" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value=".ItemListActivity" /> 
     </activity> 

     <uses-library android:name="com.google.android.maps" /> 
    </application> 

    <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="xxxxxxxxxxxxxxxxxxxxxxxxxxx" /> 

</manifest> 

정말 도움이됩니다.

+0

Google Play 라이브러리를 추가해야하며 src 디렉토리는 프로젝트의 일부 여야합니다. 어떤 IDE를 사용하고 있는지 확실하지 않거나 SO에서 예제를 지적 할 수 있습니다. –

+0

Eclipse 사용 - 어떻게 추가합니까? –

+0

[Here] (http://stackoverflow.com/questions/13719263/unable-instantiate-android-gms-maps-mapfragment/13744765#13744765)이 문제를 다루었 다. Guilherme Muniz의 답변에 유의한다. –

답변

8

MapFragmentSupportMapFragment으로 바꿉니다. SupportMapFragment은 Android 지원 패키지 백엔드 조각과 함께 사용할 수 있습니다. MapFragment은 기본 API 레벨 11 버전의 프래그먼트입니다.

+0

감사합니다 - 나는이 두 가지를 다했다. 에뮬레이터와 내 Xoom 태블릿에서 모두 NoClassDefFoundError : com.google.android.gms.R $ 스타일을 사용할 수 있음을 알고 있습니다. Google Play 서비스가 Play 스토어에서 설치되었는지 확인했지만 isGooglePlayServicesAvailable()이 1을 반환하는 것처럼 보입니다. 어떤 아이디어? –

+0

업데이트 : 이전 오류가 수정되었지만 클래스 조각 오류가 다시 발생하는 문제가 다시 발생했습니다. MapFragment를 레이아웃 xml의 SupportMapFragment로 변경했습니다. –

+0

@JamesCross : 질문에 신선한 스택 추적을 게시하는 것이 좋습니다. – CommonsWare

관련 문제