使用碎片

时间:2017-03-30 07:16:04

标签: android navigation navigation-drawer android-toolbar

如何移动到新片段并自动将“汉堡包”菜单更改为<-按钮,使用户返回上一个菜单?

这似乎是一个神秘的艺术,无论我阅读多少stackoverflow问题和我尝试“汉堡包”菜单的东西总是打开抽屉。我对使用backstacklisteners更改图标的某些帖子感到困惑,其他人使用onoptionselected和其他人直接附加点击监听器。

活动

    public class MainActivity extends AppCompatActivity {

        private ActionBarDrawerToggle drawerToggle;
        private ActionBar actionBar;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setToolbar();
            // show first fragment here
        }

        private void setToolbar() {
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            actionBar = getSupportActionBar();

            if (actionBar != null) {
                actionBar.setDisplayHomeAsUpEnabled(true);
                DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer);
                drawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.open, R.string.close);
                drawerToggle.setDrawerIndicatorEnabled(true);
                drawerToggle.syncState();
            }
        }

        @Override
        protected void onPostCreate(Bundle savedInstanceState) {
            super.onPostCreate(savedInstanceState);
            drawerToggle.syncState();
        }

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

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {


    getMenuInflater().inflate(R.menu.toolbar_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.mnuSettings:
                showSettingsFragment();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    private void showSettingsFragment() {
        getFragmentManager()
                .beginTransaction()
                .replace(R.id.fragHolder, new SettingsFragment())
                .addToBackStack(null)
                .commit();
    }
}

活动布局

<?xml version="1.0" encoding="utf-8"?>

<android.support.v4.widget.DrawerLayout 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/drawer"
                                        android:layout_width="match_parent"
                                        android:layout_height="match_parent"
                                        android:fitsSystemWindows="true">

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

        <android.support.design.widget.AppBarLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content">

            <android.support.v7.widget.Toolbar
                 android:id="@+id/toolbar"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:background="@color/primary"
                 android:minHeight="?attr/actionBarSize"
                 app:popupTheme="@style/Theme.AppCompat.Light"
                 app:theme="@style/Theme.AppCompat">

            </android.support.v7.widget.Toolbar>

            <FrameLayout
                 android:id="@+id/pnlSearch"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_margin="8dp">

                <EditText
                     android:id="@+id/txtSearch"
                     android:layout_width="match_parent"
                     android:layout_height="44dp"
                     android:background="#FAFAFA"
                     android:gravity="center"
                     android:hint="@string/search_hint"
                     android:imeOptions="flagNoExtractUi|actionDone"
                     android:inputType="textNoSuggestions"
                     android:maxLines="1"
                     android:textSize="16sp"/>

                <ImageView
                     android:layout_width="24dp"
                     android:layout_height="24dp"
                     android:layout_gravity="start|center_vertical"
                     android:layout_marginLeft="15dp"
                     android:layout_marginStart="15dp"
                     android:alpha="0.2"
                     android:contentDescription="@string/magnifying_glass_icon"
                     android:src="@drawable/ic_search_black_24dp"/>

                <Button
                     android:id="@+id/btnClear"
                     android:layout_width="24dp"
                     android:layout_height="24dp"
                     android:layout_gravity="end|center_vertical"
                     android:layout_marginEnd="15dp"
                     android:layout_marginRight="15dp"
                     android:alpha="0.5"
                     android:background="@drawable/ic_clear_black_24dp"
                     android:visibility="gone"/>

            </FrameLayout>

        </android.support.design.widget.AppBarLayout>

        <FrameLayout
             android:id="@+id/fragHolder"
             android:layout_width="match_parent"
             android:layout_height="match_parent"/>

    </LinearLayout>

    <android.support.design.widget.NavigationView
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:layout_gravity="start"
         app:headerLayout="@layout/nav_header"
         app:menu="@menu/toolbar_menu"/>

</android.support.v4.widget.DrawerLayout>

SettingsFragment:

public class SettingsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        addPreferencesFromResource(R.xml.preferences);
    }

    @Override
    public void onResume() {
        super.onResume();
        setToolbarTitle();
    }

    private void setToolbarTitle() {
        ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
        if (actionBar != null) {
            actionBar.setTitle(R.string.settings);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                getFragmentManager().popBackStack();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

我正在寻找的是实现这一目标的标准方法,而不是在不了解真正的意图如何完成的情况下开始添加Click / Backstack监听器。

3 个答案:

答案 0 :(得分:0)

在你的活动中写下这个函数:

public static void setUpIndicator(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            getSupportActionBar().setHomeAsUpIndicator(appCompatActivity.getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha, null));
        else
            getSupportActionBar().setHomeAsUpIndicator(appCompatActivity.getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha));
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }

在片段的onCreate中调用此函数。

答案 1 :(得分:0)

您应该为汉堡包

设置动画

调用方法如

Animate汉堡包后退箭头

  下面的

应该在您调用添加或替换fragment

之前调用
animateBurgerToArrow(mDrawerLayout, 1, 0);
活动

中的

来自您的评论

  永远不会从片段

调用 onOptionsItemSelected

解!! : 在活动onOptionsItemSelected onclick Home

中返回错误
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
             return false; 
        case R.id.mnuSettings:
            animateBurgerToArrow(mDrawerLayout, 1, 0);
            showSettingsFragment();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

将箭头设置为汉堡包的动画

  下面的

应该在你调用popBackStack的地方之前调用

animateBurgerToArrow(mDrawerLayout, 0, 1);
设置文字

中的

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            animateBurgerToArrow(mDrawerLayout, 0, 1);
            getFragmentManager().popBackStack();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

方式

private void animateBurgerToArrow(final View drawerView,int start,int end){
    ValueAnimator anim = ValueAnimator.ofFloat(start,end);
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            float slideOffset = (Float) valueAnimator.getAnimatedValue();
            mDrawerToggle.onDrawerSlide(drawerView, slideOffset);
        }
    });
    anim.setInterpolator(new DecelerateInterpolator());
    // You can change this duration to more closely match that of the default animation.
    anim.setDuration(500);
    anim.start();
}

答案 2 :(得分:0)

迈克M.的回答帮助了我。一旦我开始工作,我慢慢删除代码直到包装器的大小减半,然后我意识到整个工作因为一行而起作用了:

toggle.setDrawerIndicatorEnabled(false);

此时,我认为最好完全删除包装器并使用以下代码来实现相同的功能。我觉得这是最好的方法。

public class MainActivity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener
...
private void setToolbar() {
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ActionBar actionBar = getSupportActionBar();

    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer);
        drawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.open, R.string.close);
        drawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
        drawerToggle.syncState();
    }
}

@Override
public void onBackStackChanged() {
    boolean onHomeScreen = getFragmentManager().getBackStackEntryCount() == 0;
    drawerToggle.setDrawerIndicatorEnabled(onHomeScreen);
}

如果我想删除详细信息片段中的标题设置代码,或者添加到后台堆栈中的任何片段,我可以这样做:

if (!onHomeScreen) {
    String fragmentTitle = getFragmentManager()
            .findFragmentById(R.id.fragHolder)
            .getClass()
            .getSimpleName()
            .replaceAll("(\\p{Ll})(\\p{Lu})", "$1 $2")
            .replace("Fragment", "");
    actionBar.setTitle(fragmentTitle);
}

这会使SettingsFragment的标题为SettingsUserDetailsFragmentUser Details