2015-04-18 4 views
1

Собственно, это моя главная проблема. У меня есть NavigationDrawer, и я менял много вещей об этом; потому что я добавил в него TabHostFragment. Проблема в том, что я нахожусь в одном Fragment, у меня есть значок ActionBar, который идет по другому Fragment. В то время, когда вы делаете это, он работает идеально; но когда я перехожу к другому Fragment, он все еще находится на обратной стороне нового Fragment. Я попытался поместить BackGround цвет каждого Fragment, и он не виден.Фрагмент дублирует, когда я иду на другой фрагмент

Проблема в том, что сделка в порядке; но когда я нахожусь в другом Fragment, когда я нажимаю BlankSpace (например), а на старом Fragment есть кнопка здесь с Toast, она все еще показывает это Toast на новом Fragment.

Вот немного примеров того, что происходит, может быть, с изображениями, вы можете лучше понять мой вопрос:

Figure 1

Figure 2

Это основная проблема возникает, когда я иду корыто это Fragment (я называю он на MainActivity), который не имеет смысла; потому что я хочу назвать это, когда я нахожусь на определенном Fragment; но это в единственной части, которую я могу назвать это Fragment ...

Это MainActivity, где я называю это FragmentTransaction:

case R.id.newOffer: 
    android.app.FragmentManager fm = getFragmentManager(); 
    android.app.FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.frame_container, new TipusNouProducte()); 
    ft.commit(); 
    return true; 

И, кстати, я оставляю здесь код из моего NavigationDrawer для вас, что всегда, когда я иду через Fragment, он говорит «Ошибка при создании фрагмента»:

private void displayView(int position) { 
    mDrawerList.setItemChecked(position, true); 
    mDrawerList.setSelection(position); 
    setTitle(navMenuTitles[position]); 
    mDrawerLayout.closeDrawer(mDrawerList); 
    Fragment fragment = null; 

    switch (position) { 
     case 0: 
      fragment = new TabHostFragment(); 
      break; 
     case 1: 
      fragment = new LocalizacionFragment(); 
      break; 
     case 2: 
      fragment = new ListaProductosFragment(); 
      break; 
     case 3: 
      fragment = new ConfiguracionFragment(this); 
      break; 
     case 4: 
      fragment = new AyudaSugerenciasFragment(); 
      break; 
     case 5: 
      fragment = new AyudaSugerencias(); 
      break; 
     case 6: 
      finish(); 
      break; 
     default: 
      break; 
    } 

    if (fragment != null) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction() 
      .replace(R.id.frame_container, fragment).commit(); 

     // update selected item and title, then close the drawer 
     mDrawerList.setItemChecked(position, true); 
     mDrawerList.setSelection(position); 
     setTitle(navMenuTitles[position]); 
     mDrawerLayout.closeDrawer(mDrawerList); 
    } else { 
     // error in creating fragment 
     Log.e("MainActivity", "Error in creating fragment"); 
    } 
} 

Если вам нужно больше кода, который, по вашему мнению, может вызвать эту проблему, не стесняйтесь спрашивать меня; то я обновлю как можно скорее.

TabHostFragment.xml

<android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@android:id/tabhost" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

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

     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal" /> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="0dp" 
      android:layout_height="0dp" 
      android:layout_weight="0" /> 

     <FrameLayout 
      android:id="@+id/realtabcontent" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_weight="1" /> 
    </LinearLayout> 

</android.support.v4.app.FragmentTabHost> 

MainActivity код выглядит следующим образом:

public class MainActivity extends FragmentActivity { 
    private DrawerLayout mDrawerLayout; 
    private ListView mDrawerList; 
    private ActionBarDrawerToggle mDrawerToggle; 
    // saber si esta abierto 
    public boolean mDrawerOpened; 
    // nav drawer title 
    private CharSequence mDrawerTitle; 
    private FragmentTabHost mTabHost; 
    // used to store app title 
    private CharSequence mTitle; 

    //para ponerlo visible 
    public MenuItem mi; 

    // slide menu items 
    private String[] navMenuTitles; 
    private TypedArray navMenuIcons; 

    private ArrayList<NavDrawerItem> navDrawerItems; 
    private NavDrawerListAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mTitle = mDrawerTitle = getTitle(); 

     // load slide menu items 
     navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items); 

     // nav drawer icons from resources 
     navMenuIcons = getResources() 
      .obtainTypedArray(R.array.nav_drawer_icons); 

     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerList = (ListView) findViewById(R.id.list_slidermenu); 

     navDrawerItems = new ArrayList<NavDrawerItem>(); 

     // adding nav drawer items to array 
     // Home 
     navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1))); 
     // Find People 
     //navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1))); 
     // Photos 
     navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1))); 
     // Communities, Will add a counter here 
     navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1))); 
     // Pages 
     navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1))); 
     // What's hot, We will add a counter here 
     navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1))); 
     //AyudaSugerencias 
     navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1))); 
     navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons.getResourceId(6, -1))); 

     // Recycle the typed array 
     navMenuIcons.recycle(); 

     mDrawerList.setOnItemClickListener(new SlideMenuClickListener()); 

     // setting the nav drawer list adapter 
     adapter = new NavDrawerListAdapter(getApplicationContext(), 
      navDrawerItems); 
     mDrawerList.setAdapter(adapter); 

     // enabling action bar app icon and behaving it as toggle button 
     getActionBar().setDisplayHomeAsUpEnabled(true); 
     getActionBar().setBackgroundDrawable(new ColorDrawable(0xff1d97dd)); 
     getActionBar().setHomeButtonEnabled(true); 

     mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
      R.drawable.ic_drawer, //nav menu toggle icon 
      R.string.app_name, // nav drawer open - description for accessibility 
      R.string.app_name // nav drawer close - description for accessibility 
     ) { 
      public void onDrawerClosed(View view) { 
       getActionBar().setTitle(
        Html.fromHtml("<font color='ffffff'>" 
         + mTitle + "</font>")); 

       // calling onPrepareOptionsMenu() to show action bar icons 
       invalidateOptionsMenu(); 
       mDrawerOpened = false; 
       syncState(); 

      } 

      public void onDrawerOpened(View drawerView) { 
       getActionBar().setTitle(
        Html.fromHtml("<font color='ffffff'>" 
         + mDrawerTitle + "</font>")); 

       // calling onPrepareOptionsMenu() to hide action bar icons 
       invalidateOptionsMenu(); 
       mDrawerOpened = true; 
       syncState(); 
      } 
     }; 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     if (savedInstanceState == null) { 
      // on first time display view for first nav item 
      displayView(0); 
     } 
    } 

    /** 
    * Slide menu item click listener 
    */ 
    private class SlideMenuClickListener implements 
     ListView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
      // display view for selected nav drawer item 
      displayView(position); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     Fragment fragment = null; 
     // toggle nav drawer on selecting action bar app icon/title 
     if (mDrawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 
     // Handle action bar actions click 
     switch (item.getItemId()) { 
      case R.id.action_settings: 
       return true; 
      case R.id.ofertasRefresh: 
       return true; 
      case R.id.menu_search: 
       return true; 
      case R.id.newOffer: 
       android.app.FragmentManager fm = getFragmentManager(); 
       android.app.FragmentTransaction ft = fm.beginTransaction(); 
       ft.replace(R.id.frame_container, new TipusNouProducte()); 
       ft.commit(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    /* * 
    * Called when invalidateOptionsMenu() is triggered 
    */ 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // if nav drawer is opened, hide the action items 
     boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
     menu.findItem(R.id.action_settings).setVisible(!drawerOpen); 
     if (mDrawerOpened) { 
      menu.removeItem(R.id.ofertasRefresh); 
      menu.removeItem(R.id.menu_search); 
      menu.removeItem(R.id.newOffer); 
     } 
     if (!mDrawerOpened) { 
      menu.add(Menu.NONE, R.id.ofertasRefresh, Menu.NONE, mTitle); 
     } 
     return super.onPrepareOptionsMenu(menu); 
    } 

    /** 
    * Diplaying fragment view for selected nav drawer list item 
    */ 
    private void displayView(int position) { 
     mDrawerList.setItemChecked(position, true); 
     mDrawerList.setSelection(position); 
     setTitle(navMenuTitles[position]); 
     mDrawerLayout.closeDrawer(mDrawerList); 
     Fragment fragment = null; 

     switch (position) { 
      case 0: 
       fragment = new TabHostFragment(); 
       break; 
      case 1: 
       fragment = new LocalizacionFragment(); 
       break; 
      case 2: 
       fragment = new ListaProductosFragment(); 
       break; 
      case 3: 
       fragment = new ConfiguracionFragment(this); 
       break; 
      case 4: 
       fragment = new AyudaSugerenciasFragment(); 
       break; 
      case 5: 
       fragment = new AyudaSugerencias(); 
       break; 
      case 6: 
       finish(); 
       break; 
      default: 
       break; 
     } 

     if (fragment != null) { 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      fragmentManager.beginTransaction() 
       .replace(R.id.frame_container, fragment).commit(); 

      // update selected item and title, then close the drawer 
      mDrawerList.setItemChecked(position, true); 
      mDrawerList.setSelection(position); 
      setTitle(navMenuTitles[position]); 
      mDrawerLayout.closeDrawer(mDrawerList); 
     } else { 
      // error in creating fragment 
      Log.e("MainActivity", "Error in creating fragment"); 
     } 
    } 

    @Override 
    public void setTitle(CharSequence title) { 
     mTitle = title; 
     getActionBar().setTitle(mTitle); 
    } 

    /** 
    * When using the ActionBarDrawerToggle, you must call it during 
    * onPostCreate() and onConfigurationChanged()... 
    */ 
    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     mDrawerToggle.syncState(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     // Pass any configuration change to the drawer toggls 
     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 
} 

TabHostFragment выглядит следующим образом:

public class TabHostFragment extends Fragment { 
    // Declaring our tabs and the corresponding fragments. 
    public TabHostFragment(){ 

    } 
    private FragmentTabHost mTabHost; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.tab_host_test2, container, false); 
     mTabHost = (FragmentTabHost)rootView.findViewById(android.R.id.tabhost); 
     mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent); 

     mTabHost.addTab(mTabHost.newTabSpec("Mis ofertas").setIndicator("Mis ofertas"), 
      MisOfertasFragment.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("Mis recomendaciones").setIndicator("Mis recomendaciones"), 
      RecomendacionesFragment.class, null); 

     return rootView; 
    } 
} 
+0

показать ur 'fragmentActivity' xml .. –

+0

wich one? TipusNouProducte? –

+0

подождите, я думаю, у вас есть две проблемы. во-первых, у есть ошибка, а во-вторых, второй фрагмент идет за вкладками rite? .. для ошибки pls post log .. –

ответ

2

Я не уверен, что это является причиной ваша проблема, но одна вещь, которая определяется tely wrong является использование роднойFragmentManager вместо одного из библиотеки поддержки.

В вашем коде замените

case R.id.newOffer: 
    android.app.FragmentManager fm = getFragmentManager(); 
    android.app.FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.frame_container, new TipusNouProducte()); 
    ft.commit(); 
    return true; 

с

case R.id.newOffer: 
    android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); 
    android.support.v4.app.FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.frame_container, new TipusNouProducte()); 
    ft.commit(); 
    return true; 

Вы использовали поддержка библиотекиFragmentManager в других местах в вашем коде, так что вы должны продолжать использовать, что везде ,

Кроме того, TipusNouProducte должны распространяться android.support.v4.app.Fragment и НЕ android.app.Fragment.

Я обновлю этот ответ, если найду больше проблем.

+0

Снова вы спасли моего человека жизни, вы бог! Большое спасибо. Кстати, я пытаюсь сделать эту транзакцию одним нажатием кнопки, но она говорит следующее: (Check Edit на мой вопрос) Этот вопрос не совпадает с текущим вопросом, но, может быть, вы можете сказать мне, как :) –

+0

nvm Я сделал это по-своему :) желаю лучшего за вас спасибо за помощь. –

+1

Вы всегда рады ... :) –