2014-04-08 105 views
1

我試圖做一個包含3個選項卡的ActionBar的應用程序:「地圖」,「Destinatiosn」和「關於我們」。基本上我使用ViewPager作爲主要佈局,並使用Fragments作爲單獨的尋呼機視圖。android.view.InflateException:二進制XML文件行:錯誤膨脹類片段

  • 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,並且運行良好。地圖起作用。

  • Excption堆棧跟蹤

    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 
    
+0

發佈整個異常堆棧跟蹤。 – Luksprog

+0

補充,希望這有助於!感謝回覆。 – flagg327

+0

如果要將其作爲另一個片段的佈局,則不能在xml佈局(* fragment_map Layout *)中使用該'fragment'標籤。而是使用'MapView'類。 – Luksprog

回答

相關問題