如何建立与动作条,标签支持和图形页面的应用程序 [英] How to build an app with Actionbar ,Tab support and MapView

查看:188
本文介绍了如何建立与动作条,标签支持和图形页面的应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我建立一个应用程序,它看起来是这样的。

它有一个操作栏和标签,如下图所示。

标签1:应具有的ViewPage和指示显示图像

标签2:应显示地图

我是新来的机器人,但仍然不知何故设法建立使用网络资源的应用程序,并与样品来源的帮助。但我被困近图形页面(当TAB2点击)。我用TabHost,但这种力的工作,后来才知道,谷歌已经发布了新的API支持地图碎片。我甚至用谷歌API的MapFragment(新的),但我结束了是一些垃圾code。我搞砸了一切。我想从头开始。任何一个可以简单的关于如何实现它?

MapFragment.java

 公共类MapsFragment扩展片段{

    MapView的地图;
    LayoutInflater inflater_;
    的ViewGroup container_;
    查看布局;

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState)
    {
        inflater_ =充气;
        container_ =容器;

        super.onCreate(savedInstanceState);

        布局= inflater.inflate(R.layout.fragment_maps,集装箱,假);


        地图=(图形页面)layout.findViewById(R.id.mapView);



        返回(LinearLayout中)布局;
    }
 

PlaceACtivity.java

 公共类PlaceActivity扩展SherlockFragmentActivity工具
        OnShareTargetSelectedListener {

    FragmentManager FM = getSupportFragmentManager();
    DetailsFragment fragment_det = NULL;

    @覆盖
    保护无效的onCreate(包savedInstanceState){

        super.onCreate(savedInstanceState);

        动作条动作条= getSupportActionBar();
        actionBar.setHomeButtonEnabled(真正的);
        actionBar.setDisplayHomeAsUpEnabled(真正的);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

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

        tabDetails.setText(细则);
        tabMaps.setText(地图);

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

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

    私有类MyTabListener实现ActionBar.TabListener {
        @覆盖
        公共无效onTabSelected(标签选项卡,
                android.support.v4.app.FragmentTransaction英尺){

            如果(tab.getPosition()== 0){

                如果(fragment_det == NULL){
                    的System.out.println(再次);
                    fragment_det =新DetailsFragment();

                }

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

            } 其他 {

                MapAsyc M =新MapAsyc();

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

            }
        }

        @覆盖
        公共无效onTabUnselected(标签选项卡,
                android.support.v4.app.FragmentTransaction英尺){

        }

        @覆盖
        公共无效onTabReselected(标签选项卡,
                android.support.v4.app.FragmentTransaction英尺){

        }

    }

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        super.onCreateOptionsMenu(菜单);
        MenuInflater充气= getSupportMenuInflater();
        inflater.inflate(R.menu.activity_place,菜单);

        菜单项actionItem = menu.findItem(R.id.action_share);
        ShareActionProvider actionProvider =(ShareActionProvider)actionItem
                .getActionProvider();
        actionProvider.setShareHistoryFileName(空);
        actionProvider.setOnShareTargetSelectedListener(本);
        actionProvider.setShareIntent(createShareIntent());
        返回true;
    }

    公共布尔onShareTargetSelected(ShareActionProvider源,
            意向意图){
        // TODO自动生成方法存根
        this.startActivity(createShareIntent());

        返回true;
    }

    私人意图createShareIntent(){
        字符串shareText =这里是共享内容的身体;
        意图sharingIntent =新的意图(android.content.Intent.ACTION_SEND);
        sharingIntent.setType(text / plain的);

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

        返回sharingIntent;
    }

    公共布尔onOptionsItemSelected(菜单项项){
        开关(item.getItemId()){
        案例android.R.id.home:
            完();
        案例R.id.action_share:
            Toast.makeText(这一点,通过共享,Toast.LENGTH_LONG).show();
            打破;
        默认:
            打破;
        }
        返回true;
    }
}



DetailsFragment.java



 公共类DetailsFragment扩展SherlockFragment
    {

        ImageFragmentAdapter mAdapter;
        ViewPager mPager;
        PageIndicator mIndicator;

        @覆盖
        公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
                捆绑savedInstanceState)
        {
            //container.removeAllViews();
            // TODO自动生成方法存根
            查看查看= inflater.inflate(R.layout.fragment_details,集装箱,
                    假);

            mAdapter =新ImageFragmentAdapter(getActivity()getSupportFragmentManager());

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

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

            返回查看;
        }

    }
 

我的标签1是工作的罚款。当我点击选项卡2,地图将加载。但文我再次点击TAB1,我得到以下错误:::。

 二月12号至六日:30:13.891:E / AndroidRuntime(16904):java.lang.IllegalStateException:递归进入executePendingTransactions。
 

有些职位建议使用异步任务。但我不能使用它,因为我应该从MapFragment返回视图听者采取行动。

完整的错误日志

  12-06 22:54:58.609:E / AndroidRuntime(28745):致命异常:主要
12-06 22:54:58.609:E / AndroidRuntime(28745):java.lang.IllegalStateException:递归进入executePendingTransactions
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.app.FragmentManagerImpl.execPendingActions(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.app.FragmentManagerImpl.executePendingTransactions(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.app.FragmentPagerAdapter.finishUpdate(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.view.ViewPager.populate(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.view.ViewPager.setCurrentItemInternal(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.view.ViewPager.setCurrentItemInternal(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.view.ViewPager.onRestoreInstanceState(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.view.View.dispatchRestoreInstanceState(View.java:12088)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2582)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2588)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.view.View.restoreHierarchyState(View.java:12066)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.app.Fragment.restoreViewState(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.app.FragmentManagerImpl.moveToState(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.app.FragmentManagerImpl.moveToState(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.app.BackStackRecord.run(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.app.FragmentManagerImpl.execPendingActions(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.support.v4.app.FragmentManagerImpl $ 1.运行(来源不明)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.os.Handler.handleCallback(Handler.java:725)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.os.Handler.dispatchMessage(Handler.java:92)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.os.Looper.loop(Looper.java:137)
12-06 22:54:58.609:E / AndroidRuntime(28745):在android.app.ActivityThread.main(ActivityThread.java:5039)
12-06 22:54:58.609:E / AndroidRuntime(28745):在java.lang.reflect.Method.invokeNative(本机方法)
12-06 22:54:58.609:E / AndroidRuntime(28745):在java.lang.reflect.Method.invoke(Method.java:511)
12-06 22:54:58.609:E / AndroidRuntime(28745):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
12-06 22:54:58.609:E / AndroidRuntime(28745):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-06 22:54:58.609:E / AndroidRuntime(28745):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

使用 http://viewpagerindicator.com/ 您TabView的,并设置

mPager.setOffscreenPageLimit(mAdapter.getCount());

P.S您是否使用actionbarsherlok?

I am building an app which looks something like this.

It has a action bar and Tabs as shown below.

Tab 1: Should display images with ViewPage and indicator.

Tab 2: Should display maps.

I am new to android, but still somehow managed to build an app using internet resources and with the help of samples source. But i got stuck near mapview (when click on Tab2). I used TabHost, but this dint work, later on came to know that google has released new API supporting Map fragments. I even used Google API for MapFragment(the new one) but what i ended up with was some junk code. I messed up everything. I wanted to start again from scratch. Can any one brief about how implementing it.?

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;
        }

    }

My Tab 1 is working fine. When i click on Tab 2, map will load. But wen i click on tab1 again , i get the following error:::.

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

Some posts suggested to use ASYNC task. But i cant use it because i should return the view from the MapFragment to the listener to take action.

Complete error log

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)

解决方案

use http://viewpagerindicator.com/ for your tabview and set

mPager.setOffscreenPageLimit(mAdapter.getCount());

P.S Are you using actionbarsherlok?

这篇关于如何建立与动作条,标签支持和图形页面的应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆