0

我正在構建一個類似於此的應用程序。 enter image description here如何使用Actionbar,Tab支持和MapView構建應用程序

它具有一個操作欄和Tabs,如下所示。

選項卡1:應使用ViewPage和指示器顯示圖像。

表2:應顯示地圖。

我是新來的android,但仍設法建立一個應用程序使用互聯網資源和示例源的幫助。但是我在mapview附近卡住了(當點擊Tab2時)。我使用了TabHost,但是這個辛苦的工作,後來才知道谷歌已經發布了支持Map碎片的新API。我甚至使用Google API for MapFragment(新的),但是最終我得到了一些垃圾代碼。我搞砸了一切。我想從頭開始。任何人都可以簡要介紹如何實施它。

MapFragment.java

public class MapsFragment extends Fragment { 

    MapView map; 
    LayoutInflater inflater_; 
    ViewGroup container_; 
    View layout; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     inflater_=inflater; 
     container_=container; 

     super.onCreate(savedInstanceState); 

     layout = inflater.inflate(R.layout.fragment_maps, container, false); 


     map = (MapView) layout.findViewById(R.id.mapView); 



     return (LinearLayout) layout; 
    } 

PlaceACtivity.java

public class PlaceActivity extends SherlockFragmentActivity implements 
     OnShareTargetSelectedListener { 

    FragmentManager fm = getSupportFragmentManager(); 
    DetailsFragment fragment_det = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     ActionBar actionBar = getSupportActionBar(); 
     actionBar.setHomeButtonEnabled(true); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     ActionBar.Tab tabMaps = actionBar.newTab(); 
     ActionBar.Tab tabDetails = actionBar.newTab(); 

     tabDetails.setText("Details"); 
     tabMaps.setText("Maps"); 

     tabDetails.setTabListener(new MyTabListener()); 
     tabMaps.setTabListener(new MyTabListener()); 

     actionBar.addTab(tabDetails); 
     actionBar.addTab(tabMaps); 
    } 

    private class MyTabListener implements ActionBar.TabListener { 
     @Override 
     public void onTabSelected(Tab tab, 
       android.support.v4.app.FragmentTransaction ft) { 

      if (tab.getPosition() == 0) { 

       if (fragment_det == null) { 
        System.out.println("again"); 
        fragment_det = new DetailsFragment(); 

       } 

       ft.replace(android.R.id.content, fragment_det); 

      } else { 

       MapAsyc m = new MapAsyc(); 

       ft.replace(android.R.id.content, m); 

      } 
     } 

     @Override 
     public void onTabUnselected(Tab tab, 
       android.support.v4.app.FragmentTransaction ft) { 

     } 

     @Override 
     public void onTabReselected(Tab tab, 
       android.support.v4.app.FragmentTransaction ft) { 

     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     MenuInflater inflater = getSupportMenuInflater(); 
     inflater.inflate(R.menu.activity_place, menu); 

     MenuItem actionItem = menu.findItem(R.id.action_share); 
     ShareActionProvider actionProvider = (ShareActionProvider) actionItem 
       .getActionProvider(); 
     actionProvider.setShareHistoryFileName(null); 
     actionProvider.setOnShareTargetSelectedListener(this); 
     actionProvider.setShareIntent(createShareIntent()); 
     return true; 
    } 

    public boolean onShareTargetSelected(ShareActionProvider source, 
      Intent intent) { 
     // TODO Auto-generated method stub 
     this.startActivity(createShareIntent()); 

     return true; 
    } 

    private Intent createShareIntent() { 
     String shareText = "Here is the share content body"; 
     Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); 
     sharingIntent.setType("text/plain"); 

     sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareText); 

     return sharingIntent; 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      finish(); 
     case R.id.action_share: 
      Toast.makeText(this, "Share Via", Toast.LENGTH_LONG).show(); 
      break; 
     default: 
      break; 
     } 
     return true; 
    } 
} 



DetailsFragment.java 



public class DetailsFragment extends SherlockFragment 
    { 

     ImageFragmentAdapter mAdapter; 
     ViewPager mPager; 
     PageIndicator mIndicator; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) 
     { 
      //container.removeAllViews(); 
      // TODO Auto-generated method stub 
      View view = inflater.inflate(R.layout.fragment_details, container, 
        false); 

      mAdapter = new ImageFragmentAdapter(getActivity().getSupportFragmentManager()); 

      mPager = (ViewPager) view.findViewById(R.id.pager); 
      mPager.setAdapter(mAdapter); 

      mIndicator = (CirclePageIndicator) view.findViewById(R.id.indicator); 
      mIndicator.setViewPager(mPager); 

      return view; 
     } 

    } 

我的選項卡1是工作的罰款。當我點擊標籤2時,地圖會加載。但是,我再次點擊tab1,我得到以下錯誤:::。

12-06 02:30:13.891: E/AndroidRuntime(16904): java.lang.IllegalStateException: Recursive entry to executePendingTransactions. 

一些帖子建議使用ASYNC任務。但我不能使用它,因爲我應該從MapFragment返回視圖給監聽器採取行動。

完全錯誤日誌

12-06 22:54:58.609: E/AndroidRuntime(28745): FATAL EXCEPTION: main 
12-06 22:54:58.609: E/AndroidRuntime(28745): java.lang.IllegalStateException: Recursive entry to executePendingTransactions 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.app.FragmentManagerImpl.execPendingActions(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.view.ViewPager.populate(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.view.ViewPager.setCurrentItemInternal(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.view.ViewPager.setCurrentItemInternal(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.view.ViewPager.onRestoreInstanceState(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.view.View.dispatchRestoreInstanceState(View.java:12088) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2582) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2588) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.view.View.restoreHierarchyState(View.java:12066) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.app.Fragment.restoreViewState(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.app.BackStackRecord.run(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.app.FragmentManagerImpl.execPendingActions(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.support.v4.app.FragmentManagerImpl$1.run(Unknown Source) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.os.Handler.handleCallback(Handler.java:725) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.os.Looper.loop(Looper.java:137) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at android.app.ActivityThread.main(ActivityThread.java:5039) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at java.lang.reflect.Method.invokeNative(Native Method) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at java.lang.reflect.Method.invoke(Method.java:511) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
12-06 22:54:58.609: E/AndroidRuntime(28745): at dalvik.system.NativeStart.main(Native Method) 
+0

您是否在您的項目中添加了google-play-services.jar? – rajpara

+0

你已添加。但我不知道如何正確使用它。他們剛剛告訴過,添加地圖與在佈局中添加片段一樣簡單。但是我怎樣才能在tab中使用它? –

+0

這是官方指南https://developers.google.com/maps/documentation/android/,並檢查此答案,如果它可以幫助你http://stackoverflow.com/a/13721895/582571 – rajpara

回答

1

使用http://viewpagerindicator.com/您TabView的,並設置

mPager.setOffscreenPageLimit(mAdapter.getCount());

P.S您使用的是actionbarsherlok嗎?

+0

:雅我使用actionbarsherlok。 ActionBarSherlock存在問題嗎? –

+0

看來問題出在錯誤的實施tqab酒吧。在支持庫中有一個地圖片段,所以我認爲它工作正常。你應該從這裏採取標籤欄實施http://developer.android.com/tools/samples/index.html P.S我更喜歡viewpageindicator over tabbar – Greensy

相關問題