1

我正在尝试制作一个包含带有 3 个选项卡的 ActionBar 的应用程序:“地图”、“目的地”和“关于我们”。基本上,我使用 ViewPager 作为主要布局,对于单个寻呼机视图,我使用 Fragments。

  • activity_main.xml

    <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    </android.support.v4.view.ViewPager>
    
  • MainActivity.java

    public class MainActivity extends FragmentActivity implements ActionBar.TabListener {   
    private ViewPager viewPager;
    private TabsPagerAdapter mAdapter;
    private ActionBar actionBar;
    // Tab titles
    private String[] tabs = { "Maps", "Destinations", "About us" };
    
    /***************************************************************************************
     * 
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Initialization
        //tabs = getResources().getStringArray(R.array.tabs_titles);
        viewPager = (ViewPager) findViewById(R.id.pager);
        actionBar = getActionBar();
        mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    
        viewPager.setAdapter(mAdapter);
        //actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        
    
        // Adding Tabs
        for (String tab_name : tabs) {
            actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
        }
    
        /**
         * on swiping the viewpager make respective tab selected
         * */
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    
            @Override
            public void onPageSelected(int position) {
                // on changing the page
                // make respected tab selected
                actionBar.setSelectedNavigationItem(position);
            }
    
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }
    
            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });
    }
    
    /***************************************************************************************
     * 
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    /***************************************************************************************
     * 
     */
    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction arg1) {
    
    
    }
    
    /***************************************************************************************
     * 
     */
    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction arg1) {
        // on tab selected
        // show respected fragment view
        viewPager.setCurrentItem(tab.getPosition());
    
    }
    
    /***************************************************************************************
     * 
     */
    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction arg1) {
        // TODO Auto-generated method stub
    
    }
    

    }

我正在创建一个 FragmentPagerAdapter 类来为选项卡片段提供视图。

public class TabsPagerAdapter extends FragmentPagerAdapter {

public TabsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int index) {
    switch (index) {
    case 0:
        // Map fragment activity
        return new MapFragment();
    case 1:
        // Destinations fragment activity
        return new DestinationsFragment();
    case 2:
        // About Us fragment activity
        return new AboutUsFragment();
    }

    return null;
}

@Override
public int getCount() {
    // get item count - equal to number of tabs
    return 3;
}

}

每个项目都有一个带有其活动类的布局文件。

  1. 地图

    • fragment_map 布局

      <LinearLayout 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"
      android:orientation="vertical" >
      
      <fragment
          android:id="@+id/map"
          android:name="com.google.android.gms.maps.SupportMapFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent"/>
      
      </LinearLayout>
      
    • MapFragment 类

      public class MapFragment extends Fragment {
      GoogleMap mapa;
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {    
      
      try{
          if(mapa == null){
              mapa = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap(); 
          }             
          View rootView = inflater.inflate(R.layout.fragment_map, container, false);          
          return rootView;
      }catch(Exception e){
          View rootView = inflater.inflate(R.layout.fragment_map, container, false);
      
          e.printStackTrace();
          return rootView;
      }
      

      } }

    • 目的地(现在只是一个带有文本视图的相对布局)

布局

        <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="#ff8400" >

            <TextView 
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="Destinations Screen"
                android:textSize="20sp"
                android:layout_centerInParent="true"/>
        </RelativeLayout>

班级

public class DestinationsFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {


        Log.d("", "CESAR");
        View rootView = inflater.inflate(R.layout.fragment_destinations, container, false);

        return rootView;
    }
}
  • 关于我们(现在只是一个带有文本视图的相对布局)

布局

        <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:background="#17df0d">

        <TextView android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Diseñar la pantalla de About Us"
            android:textSize="20sp"
            android:layout_centerInParent="true"/>

        </RelativeLayout>

班级

        public class AboutUsFragment extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_about_us, container, false);

        return rootView;
     }
     }

问题是,当我从“关于我们”选项卡更改为任何其他选项卡时,应用程序停止工作并崩溃。但是,当我从选项卡“目的地”更改为“地图”选项卡并向后更改时,这不会发生。当我添加 MapFragment 时出现此错误,在此之前,地图布局只是带有文本视图的 RelativeLayout,并且运行良好。地图有效。

  • 异常堆栈跟踪

    04-10 00:35:23.070: W/System.err(16428): android.view.InflateException: Binary XML file line #7: Error inflating class fragment
    04-10 00:35:23.070: W/System.err(16428):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java)
    04-10 00:35:23.070: W/System.err(16428):    at android.view.LayoutInflater.rInflate(LayoutInflater.java)
    04-10 00:35:23.070: W/System.err(16428):    at android.view.LayoutInflater.inflate(LayoutInflater.java)
    04-10 00:35:23.075: W/System.err(16428):    at android.view.LayoutInflater.inflate(LayoutInflater.java)
    04-10 00:35:23.075: W/System.err(16428):    at com.bikes.touristtest.MapaFragment.onCreateView(MapaFragment.java:22)
    04-10 00:35:23.075: W/System.err(16428):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
    04-10 00:35:23.075: W/System.err(16428):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
    04-10 00:35:23.075: W/System.err(16428):    at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1291)
    04-10 00:35:23.080: W/System.err(16428):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:672)
    04-10 00:35:23.080: W/System.err(16428):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
    04-10 00:35:23.080: W/System.err(16428):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:478)
    04-10 00:35:23.080: W/System.err(16428):    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
    04-10 00:35:23.080: W/System.err(16428):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
    04-10 00:35:23.085: W/System.err(16428):    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:550)
    04-10 00:35:23.085: W/System.err(16428):    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:509)
    04-10 00:35:23.085: W/System.err(16428):    at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:490)
    04-10 00:35:23.085: W/System.err(16428):    at com.bikes.touristtest.MainActivity.onTabSelected(MainActivity.java:92)
    04-10 00:35:23.090: W/System.err(16428):    at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java)
    04-10 00:35:23.090: W/System.err(16428):    at com.android.internal.app.ActionBarImpl$TabImpl.select(ActionBarImpl.java)
    04-10 00:35:23.090: W/System.err(16428):    at com.android.internal.widget.ScrollingTabContainerView$TabClickListener.onClick(ScrollingTabContainerView.java)
    04-10 00:35:23.090: W/System.err(16428):    at android.view.View.performClick(View.java)
    04-10 00:35:23.090: W/System.err(16428):    at android.view.View$PerformClick.run(View.java)
    04-10 00:35:23.090: W/System.err(16428):    at android.os.Handler.handleCallback(Handler.java)
    04-10 00:35:23.095: W/System.err(16428):    at android.os.Handler.dispatchMessage(Handler.java)
    04-10 00:35:23.095: W/System.err(16428):    at android.os.Looper.loop(Looper.java)
    04-10 00:35:23.095: W/System.err(16428):    at android.app.ActivityThread.main(ActivityThread.java)
    04-10 00:35:23.095: W/System.err(16428):    at java.lang.reflect.Method.invokeNative(Native Method)
    04-10 00:35:23.095: W/System.err(16428):    at java.lang.reflect.Method.invoke(Method.java:511)
    04-10 00:35:23.095: W/System.err(16428):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
    04-10 00:35:23.100: W/System.err(16428):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
    04-10 00:35:23.100: W/System.err(16428):    at dalvik.system.NativeStart.main(Native Method)
    04-10 00:35:23.100: W/System.err(16428): Caused by: java.lang.IllegalArgumentException: Binary XML file line #7: Duplicate id 0x7f050040, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment
    04-10 00:35:23.105: W/System.err(16428):    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:296)
    04-10 00:35:23.105: W/System.err(16428):    ... 31 more
    
4

1 回答 1

0

查看Android、谷歌地图片段和 viewpager - 膨胀类片段时出错

我仍在努力实施该解决方案,但它似乎是可行的。

于 2015-05-18T01:42:00.577 回答