4

보기 호출기를 사용하여 세 가지보기를 표시하고 있습니다.안드로이드 : ViewPager를 사용하여 조각 내부에 액세스

"Filter","Streets","Around" 

각보기는 단편으로 정의됩니다.

내가 원하는 : 내 FilterFragment 내에서 Mapview를 사용하고 싶습니다.

은 내가 무엇을했는지 :

내가 필터 조각 내부지도보기를 사용하고 싶지만 성공적으로 실행 할 수 수 없습니다. 그리고 얻기 로그 케이트 오류 :

android.view.InflateException: Binary XML file line #33: Error inflating class com.google.android.maps.MapView

나는 또한이 문제에 대해 인터넷과 유래에 검색하고 LINKLINK하지만 내 문제와 관련이 링크를 찾을 수 없습니다 내가 단편을 사용하고로 발견했다 ViewPager.

나는 아래 코드를 기재하였습니다.

package com.example.viewpageractivitydemo; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class FilterFragment extends Fragment { 

    /* 
    * @Override protected Class<? extends Activity> getActivityClass() { // 
    * TODO Auto-generated method stub return MyFilterActivity.class; } 
    */ 

    public static Fragment newInstance(int position) { 

     Log.i("FilterFragment","Inside New Instasnce"); 
     FilterFragment filterFragment = new FilterFragment(); 
     return filterFragment; 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     Log.i("FilterFragment","Inside OcCreateView"); 
     View view = inflater.inflate(R.layout.filter, null); 
     return view; 
    } 

} 

: 여기

package com.example.viewpageractivitydemo; 

    import com.example.viewpageractivitydemo.viewpager.TitlePageIndicator; 

    import android.os.Bundle; 
    import android.support.v4.app.FragmentActivity; 
    import android.support.v4.view.ViewPager; 
    import android.util.Log; 

    public class MainViewPager extends FragmentActivity { 

     TestFragmentAdapter adapter; 
     ViewPager pager; 

     @Override 
     protected void onCreate(Bundle arg0) { 
      // TODO Auto-generated method stub 
      super.onCreate(arg0); 
      Log.i("MainViewPager","Inside Oncreate"); 
      setContentView(R.layout.mainviewpager); 
      pager = (ViewPager) findViewById(R.id.pager); 

      adapter = new TestTitleFragmentAdapter(getSupportFragmentManager()); 
      pager.setAdapter(adapter); 

      TitlePageIndicator indicator = (TitlePageIndicator) findViewById(R.id.indicator); 
      indicator.setViewPager(pager); 
      pager.setCurrentItem(1); 

     } 

     @Override 
     protected void onResume() { 
      // TODO Auto-generated method stub 
      super.onResume(); 

    //  pager.setCurrentItem(1); 
     } 

    } 

이 TestFragmentAdapter.java

여기
package com.example.viewpageractivitydemo; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.util.Log; 

public class TestFragmentAdapter extends FragmentPagerAdapter { 

    protected static final String[] CONTENT = new String[] { "Filter", 
      "Streets", "Around" }; 
    public String TAG = "TestFragmentAdapter"; 
    private int mCount = CONTENT.length; 

    public TestFragmentAdapter(FragmentManager fm) { 
     super(fm); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // TODO Auto-generated method stub 
     Log.i(TAG, "Inside getItemMethod with position " + position); 

     if (position == 0) { 
      Log.i("TestFragmentAdapter","Inside if Condition"); 
      return FilterFragment.newInstance(position); 
     } else if (position == 1) { 
      return StreetsFragment.newInstance(position); 
     } else if (position == 2) { 
      return AroundFragment.newInstance(position); 
     } else { 
      return null; 
     } 
     // return MainFragment.newInstance(CONTENT[position % CONTENT.length]); 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return mCount; 
    } 

    public void setCount(int count) { 
     if (count > 0 && count <= 10) { 
      mCount = count; 
      notifyDataSetChanged(); 
     } 
    } 

} 

FilterFragment.java에 대한 나의 코드입니다에 대한 코드입니다 : 여기

는 MainViewPager.java에 대한 나의 코드입니다 다음은 filter.xml에 대한 내 코드입니다.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#C6CDD4" 
    android:gravity="center" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" > 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#93A4BA" 
      android:gravity="center" > 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentLeft="true" 
       android:layout_margin="5dp" 
       android:gravity="center" 
       android:text="Where Am I" 
       android:textColor="#ffffff" 
       android:textSize="18dp" 
       android:textStyle="bold" > 
      </TextView> 
     </LinearLayout> 

     <com.google.android.maps.MapView 
      android:id="@+id/whereami_mapview" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:apiKey="0-PaH6rk7RKrZSMd_lqdrZi6FazYyIlX5r6YFyA" 
      android:clickable="true" /> 

     <!-- 
      <com.google.android.maps.MapView 
      android:id="@+id/whereami_mapview" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:apiKey="0-PaH6rk7RKrZSMd_lqdrZi6FazYyIlX5r6YFyA" /> 



     --> 
    </LinearLayout> 

</LinearLayout> 

제발 누구든지 내 문제를 해결하기 위해 대답 해줄 수 있습니까? 나는 이것에 많은 시간을 보냈다. 아직 내 질문에 대한 아이디어를 얻지 못했습니다. Thnks in Advance.

답변

6

LocalActivityManager을 사용하여 조각 내에서 활동을 호스트 할 수 있습니다. 사용되지 않는 클래스이지만 가장 간단한 솔루션을 제공합니다.

다음은 조각에 대한 코드입니다 (코드에 MyFilterFragment). YourMapActivityMapActivity을 확장하는 기본 활동입니다.

public class MapFragment extends Fragment { 
    private static final String KEY_STATE_BUNDLE = "localActivityManagerState"; 

    private LocalActivityManager mLocalActivityManager; 

    protected LocalActivityManager getLocalActivityManager() { 
     return mLocalActivityManager; 
    } 

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

     Bundle state = null; 
     if (savedInstanceState != null) { 
      state = savedInstanceState.getBundle(KEY_STATE_BUNDLE); 
     } 

     mLocalActivityManager = new LocalActivityManager(getActivity(), true); 
     mLocalActivityManager.dispatchCreate(state); 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
      //This is where you specify you activity class 
     Intent i = new Intent(getActivity(), YourMapActivity.class); 
     Window w = mLocalActivityManager.startActivity("tag", i); 
     View currentView=w.getDecorView(); 
     currentView.setVisibility(View.VISIBLE); 
     currentView.setFocusableInTouchMode(true); 
     ((ViewGroup) currentView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 
     return currentView; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putBundle(KEY_STATE_BUNDLE, 
       mLocalActivityManager.saveInstanceState()); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mLocalActivityManager.dispatchResume(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     mLocalActivityManager.dispatchPause(getActivity().isFinishing()); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     mLocalActivityManager.dispatchStop(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mLocalActivityManager.dispatchDestroy(getActivity().isFinishing()); 
    } 
} 


편집 :이 답변이 게시 된 이후 구글은 공식 MapFragment 클래스와 단편 지원 Google지도 안드로이드 API를 출시했습니다.

+0

나는 귀하의 코드를 사용했지만 Dnt Knew가 Running App 중에 ClassDefNotFound 문제에 직면하고 있습니다. Dnt는 왜 알았습니다. 나는 Menifest 파일에 선언했다. –

+0

그것은 내 문제를 매우 쉽게 해결합니다. 지원을위한 Thnx. 정말 많이 다시 한번 감사드립니다 !!!! –

+1

뷰 페이지를 스 와이프하면 충돌이 발생합니다. 오류 : 지정된 자식에 이미 상위 항목이 있습니다. 먼저 부모의 removeview()를 호출해야합니다. –

0

Google지도를 사용하려면 수행하지 않은 MapActivity을 확장해야합니다. 문서에서 this example을 확인하십시오. 유지 관리의 정신으로 비추천 기능을 사용하는 솔루션에 의지하지 않을 것입니다.

보다 확실한 해결책은 MapActivity을 확장하고 누락 된 구현을 FragmentActivity에서 복사하는 것입니다.구형 안드로이드 버전과의 역 호환성을 원하지 않거나 필요가 없다면 FragmentActivity보다는 MapActivity을 사용하십시오. 안드로이드 3.0 이상에서 Fragment을 표시하는 데 필요한 기능이 이미 포함되어 있어야합니다.


편집 : here's a project that did it for you.

관련 문제