2015-04-20 2 views
1

Я могу добавить фрагмент в свой фрагмент, но когда я пытаюсь заменить фрагмент на новый, экран пуст. Я могу добавить новый фрагмент, но потом он не прокручивается. Я также не могу удалить фрагмент. Кто-нибудь знает, что я делаю неправильно? Я красен много об этом, и я чувствую, что я перепробовал все ..Замена фрагментов в одном действии

framelayout определяется статическим:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:minWidth="25px" 
    android:minHeight="25px"> 
    <FrameLayout 
     android:id="@+id/fragment_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</LinearLayout>' 

И это способ переключения фрагментов: пустот TabOnTabSelected (объект отправителя, ActionBar .TabEventArgs tabEventArgs) { ActionBar.Tab tab = (ActionBar.Tab) отправитель;

var fragmentTransaction = FragmentManager.BeginTransaction(); 

    switch (tab.Text) { 
    case "vandaag": 
     if (currentFragment != null) { 
      fragmentTransaction.Remove (FragmentManager.FindFragmentByTag ("gister")); 
     } 
     if (fragmentToday == null) { 
      fragmentToday = WZWVDataOverview.NewInstance (DateTime.Now.AddDays (0).ToString ("d-M-yyyy")); 
     } 
     fragmentTransaction.Add (Resource.Id.fragment_container, fragmentToday, "vandaag"); 
     currentFragment = fragmentToday; 
     break; 
    case "gister": 
     if (currentFragment != null) { 
      fragmentTransaction.Remove (currentFragment); 
     } 

     if (fragmentYesterday == null) { 
      fragmentYesterday = WZWVDataOverview.NewInstance (DateTime.Now.AddDays (-1).ToString ("d-M-yyyy")); 
     } 
     currentFragment = fragmentYesterday; 
     fragmentTransaction.Add (Resource.Id.fragment_container, currentFragment, "gister"); 

     break; 

    case "morgen": 
     if (currentFragment != null) { 
      fragmentTransaction.Remove (currentFragment); 
     } 
     if (fragmentTomorrow == null) { 
      fragmentTomorrow = WZWVDataOverview.NewInstance (DateTime.Now.AddDays (+1).ToString ("d-M-yyyy")); 
     } 
     fragmentTransaction.Add (Resource.Id.fragment_container, fragmentTomorrow); 
     currentFragment = fragmentTomorrow; 
     break; 
    } 

    fragmentTransaction.Commit(); 
} 

XML из framelayout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:minWidth="25px" 
    android:minHeight="25px"> 
    <ListView 
     android:minWidth="25px" 
     android:minHeight="25px" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/list" /> 
</LinearLayout> 

Огромное спасибо заранее!

ответ

1

Вы можете попробовать использовать метод .replace. Если вы не хотите, чтобы вернуться к предыдущему фрагменту, вы можете удалить addToBackStack().

Возможно, это немного изменится, чтобы соответствовать вашему приложению.

FragmentManager fragmentManager = getFragmentManager(); 
Fragment mFragment = new DetailFragment(); 
mFragment.setArguments(bundle); 
fragmentManager.beginTransaction().replace(R.id.fragment_container, mFragment).addToBackStack("DETAILFRAGMENT").commit(); 

ВОЗМОЖНОСТЬ ВТОРОЙ РЕШЕНИЕ:

Проверьте, чтобы увидеть, как фрагмент макета XML является. Возможно, попробуйте использовать FrameLayout в качестве родителя.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      xmlns:app="http://schemas.android.com/apk/res-auto" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      tools:context="com.modup.fragment.DetailFragment"> 

    <!-- TODO: Update blank fragment layout --> 
    <LinearLayout 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 
    </LinearLayout> 
</FrameLayout> 
+0

Спасибо за помощь. Я уже пробовал заменить, так как это самое естественное решение, но оно как-то не работает. У меня заканчивается пустой экран. – Miriam

+0

Можете ли вы опубликовать XML-макет фрагмента, с которым возникают проблемы? Я опубликовал потенциальное второе решение. –

+0

Я добавил рамочный макет, чтобы попробовать ваше второе решение – Miriam

-1

Попробуйте использовать fragmentTransaction.replace() вместо fragmentTransaction.add() и закомментировать код для удаления фрагментов. Когда вы заменяете фрагмент, он удаляется. Также - не забудьте позвонить: fragmentTransaction.commit(), когда вы закончите замену фрагментов.

0

У меня есть открытые фрагменты зрения навигации, как элементы выбираются из него. (У меня есть использование DataBinding Concept)

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<layout> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.k15.projectkhyatisalesapp.activities.MainActivity"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     app:titleTextColor="#ffffff" 
     android:background="#ef6c00" 
     android:minHeight="?attr/actionBarSize" 
     app:popupTheme="@style/AppTheme.PopupOverlay" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark"/> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginTop="55dp" 
     android:orientation="horizontal"> 

     <android.support.v4.widget.DrawerLayout 
      android:id="@+id/drawerLayout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 
      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"> 
       <FrameLayout 
        android:layout_width="wrap_content" 
        android:id="@+id/activity_main_frame_layout" 
        android:layout_height="wrap_content"/> 
      </LinearLayout> 
      <android.support.design.widget.NavigationView 
       android:id="@+id/activity_main_navigation" 
       android:layout_width="wrap_content" 
       android:layout_height="match_parent" 
       android:layout_gravity="start" 
       android:fitsSystemWindows="true" 
       app:menu="@menu/listnavigation" /> 
     </android.support.v4.widget.DrawerLayout> 
    </LinearLayout> 
</RelativeLayout> 
<layout> 

MainActivity.java меню

public class MainActivity extends AppCompatActivity { 
//Declaration of Variables 
private ActivityMainBinding mainBinding;  //for binding values in xml 
private ActionBarDrawerToggle mDrawableToogle;  //This class provides a handy way to tie together the functionality of DrawerLayout and the framework ActionBar to implement the recommended design for navigation drawers. 
private Fragment fragment; 
private Class fragmentClass = null;  //pointing to class of fragment 

    @Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); 

    setSupportActionBar(mainBinding.toolbar); //o designate a Toolbar as the action bar for an Activity 
    setUpDrawer(mainBinding.activityMainNavigation); //for select items in navigationView 

    mDrawableToogle = setupToogle(); 
    mainBinding.drawerLayout.addDrawerListener(mDrawableToogle); 
} 


//private method to set navigationView 
private void setUpDrawer(NavigationView navigationView) { 
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      try { 
       selectItem(item); //call when item is selected from navigationView 
      } catch (IllegalAccessException | InstantiationException e) { 
       e.printStackTrace(); 
      } 
      return true; 
     } 
    }); 
} 

//items are selected from navigationView 
public void selectItem(MenuItem menuItem) throws IllegalAccessException, InstantiationException { 

    switch (menuItem.getItemId()) { 
     case R.id.Home: 
      fragmentClass = Home.class; 
      break; 
     case R.id.Product: 
      fragmentClass = Product.class; 
      break; 
     case R.id.Media: 
      fragmentClass = Media.class; 
      break; 
    } 

    assert fragmentClass != null; 
    fragment = (Fragment) fragmentClass.newInstance(); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(mainBinding.activityMainFrameLayout.getId(), fragment).commit(); //change the fragment 
    setTitle(menuItem.getTitle()); 
    menuItem.setCheckable(true); //for set selected item 
    mainBinding.drawerLayout.closeDrawers(); 
} 

@Override 
protected void onPostCreate(@Nullable Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawableToogle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mDrawableToogle.onConfigurationChanged(newConfig); 
} 

private ActionBarDrawerToggle setupToogle() { 
    return new ActionBarDrawerToggle(this, mainBinding.drawerLayout, mainBinding.toolbar, R.string.open, R.string.close); 
} 

/listnavigation.xml прикреплен к просмотру навигации. Я содержит элементы навигации.

В моем коде как элементы выбраны из вида навигации, соответственно заменяется фрагмент. Здесь Home, Product, Media - мой фрагмент, вы можете создать любой фрагмент.

Смежные вопросы