替换一个活动中的片段

时间:2015-04-20 20:01:36

标签: android xamarin

我能够将片段添加到我的fragmentlayout中,但是当我尝试用新片段替换片段时,屏幕是空白的。我可以添加一个新片段,但它不可滚动。我也无法删除片段。 有人知道我做错了什么吗?我对它很感兴趣,我觉得我已经尝试了一切......

framelayout定义为static:

<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>'

这是切换片段的方法:         void TabOnTabSelected(对象发送者,ActionBar.TabEventArgs tabEventArgs)         {         ActionBar.Tab tab =(ActionBar.Tab)sender;

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

framelayout的XML:

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

提前非常感谢!

3 个答案:

答案 0 :(得分:1)

您可以尝试使用.replace方法。如果您不希望能够移回上一个片段,则可以移除addToBackStack()。

可能需要略微更改以适合您的应用。

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

可能的第二个解决方案:

检查Fragment布局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>

答案 1 :(得分:0)

我从导航视图中打开片段,因为从中选择了项目。(我使用了数据绑定概念)<​​/ p>

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

menu / listnavigation.xml附加到导航视图我包含导航视图项。

在我的代码中,从导航视图中选择项目,因此替换了片段。在这里Home,Product,Media是我的片段,你可以创建任何片段。

答案 2 :(得分:-1)

尝试使用fragmentTransaction.replace()代替fragmentTransaction.add()并注释掉删除片段的代码。当您替换片段时 - 它将被删除。另外 - 记得在完成替换片段后调用:fragmentTransaction.commit()