1

I'm getting some problems creating a settings page using MvxPreferenceFragmentCompat. I've already shown the preferences view, but I could not include the toolbar in the same page.

I'm using XPlatformMenus sample to create my app. I've already try many solutions like attempt 1 or attempt 2, but no success.

Here is my current code:

SettingsFragment.cs

[MvxFragment(typeof(MainViewModel), Resource.Id.content_frame)]
[Register("myapp.droid.fragments.SettingsFragment")]
public class SettingsFragment : BasePreferenceFragment<SettingsViewModel>
{
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        base.showHamburgerMenu = true;
        return base.OnCreateView(inflater, container, savedInstanceState);
    }

    public override void OnCreatePreferences(Bundle savedInstanceState, string rootKey)
    {
        this.AddPreferencesFromResource(FragmentId);
    }

    protected override int FragmentId
    {
        get
        {
            return Resource.Layout.fragment_settings;
        }
    }
}

fragment_settings.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
  android:key="pref_sync"
  android:title="Title sample"
  android:summary="Here is the checkbox summary"
  android:defaultValue="true" />
</PreferenceScreen>

BasePreferenceFragment

public abstract class BasePreferenceFragment : MvxPreferenceFragmentCompat
{
    protected Toolbar _toolbar;
    protected MvxActionBarDrawerToggle _drawerToggle;
    /// <summary>
    /// If true show the hamburger menu
    /// </summary>
    protected bool showHamburgerMenu = false;

    protected BasePreferenceFragment()
    {
        RetainInstance = true;
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        var view = base.OnCreateView(inflater, container, savedInstanceState);

        _toolbar = view.FindViewById<Toolbar>(Resource.Id.toolbar);
        if (_toolbar != null)
        {
            ((MainActivity)Activity).SetSupportActionBar(_toolbar);
            if (showHamburgerMenu)
            {
                ((MainActivity)Activity).SupportActionBar.SetDisplayHomeAsUpEnabled(true);

                _drawerToggle = new MvxActionBarDrawerToggle(
                    Activity,                               // host Activity
                    ((MainActivity)Activity).DrawerLayout,  // DrawerLayout object
                    _toolbar,                               // nav drawer icon to replace 'Up' caret
                    Resource.String.drawer_open,            // "open drawer" description
                    Resource.String.drawer_close            // "close drawer" description
                );
                _drawerToggle.DrawerOpened += (object sender, ActionBarDrawerEventArgs e) =>
                {
                    if (Activity != null)
                        ((MainActivity)Activity).HideSoftKeyboard();
                };
                ((MainActivity)Activity).DrawerLayout.AddDrawerListener(_drawerToggle);
            }
        }

        return view;
    }

    protected abstract int FragmentId { get; }

    public override void OnConfigurationChanged(Configuration newConfig)
    {
        base.OnConfigurationChanged(newConfig);
        if (_toolbar != null && null != _drawerToggle)
        {
            _drawerToggle.OnConfigurationChanged(newConfig);
        }
    }

    public override void OnActivityCreated(Bundle savedInstanceState)
    {
        base.OnActivityCreated(savedInstanceState);
        if (_toolbar != null && null != _drawerToggle)
        {
            _drawerToggle.SyncState();
        }
    }
}

public abstract class BasePreferenceFragment<TViewModel> : BasePreferenceFragment where TViewModel : class, IMvxViewModel
{
    public new TViewModel ViewModel
    {
        get { return (TViewModel)base.ViewModel; }
        set { base.ViewModel = value; }
    }
}

toolbar_actionbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:id="@+id/appbar"
android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    local:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>

fragment_setting_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
  <include
  layout="@layout/toolbar_actionbar" />
  <FrameLayout
  android:id="@+id/content_frame"
  android:layout_below="@+id/appbar"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" />
</RelativeLayout>

What am I doing wrong? Any idea?

Community
  • 1
  • 1
idenardi
  • 600
  • 1
  • 6
  • 20

0 Answers0