点击监听器上的工具栏汉堡包?

时间:2015-11-29 10:49:01

标签: android android-navigation-drawer hamburger-menu

我在我的Android应用程序中实现了像google play这样的持久搜索视图。这是我的代码。

public class NavigationDrawerActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    private EditText searchView;
    private ActionBarDrawerToggle toggle;
    private DrawerLayout drawer;
    private TextView appName;
    private boolean isNavigationDrawerOpened;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_navigation_drawer);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        CoordinatorLayout coordinatorLayout = (CoordinatorLayout)findViewById(R.id.mainLayout);
        coordinatorLayout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if(isNavigationDrawerOpened){
                    hideSearchAndEnableAppName();
                }
                return false;
            }
        });
        searchView = (EditText) findViewById(R.id.searchView);
        appName = (TextView) findViewById(R.id.appName);
        searchView.setVisibility(View.GONE);
        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(getApplicationContext(),"asdfasdfasdf",Toast.LENGTH_LONG).show();
                return false;
            }
        });
        drawer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getApplicationContext(), "asdfasfasdf", Toast.LENGTH_SHORT).show();
            }
        });
        toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);


        drawer.setDrawerListener(toggle);
        toggle.syncState();
        toggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(NavigationDrawerActivity.this,"yayyy mani got it",Toast.LENGTH_LONG).show();
            }
        });

        appName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (!isNavigationDrawerOpened) {

                    searchView.setVisibility(View.VISIBLE);
                    searchView.requestFocus();
                    appName.setVisibility(View.GONE);
                    isNavigationDrawerOpened = true;
                    animateDrawerIndicator(true);
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(view.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            }
        });

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }

    private void hideSearchAndEnableAppName() {
        animateDrawerIndicator(false);
        isNavigationDrawerOpened = false;
        searchView.setVisibility(View.GONE);
        appName.setVisibility(View.VISIBLE);
        View view = this.getCurrentFocus();
        if (view != null) {
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }

    @Override
    public void onBackPressed() {

        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        }
        else if(isNavigationDrawerOpened){
            hideSearchAndEnableAppName();
        }else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case android.R.id.home:
                drawer.openDrawer(GravityCompat.START);
                Toast.makeText(getApplicationContext(),"asdfasdf",Toast.LENGTH_SHORT).show();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_camera) {
            // Handle the camera action
        } else if (id == R.id.nav_gallery) {

        } else if (id == R.id.nav_slideshow) {

        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        drawer.closeDrawer(GravityCompat.START);
        return true;
    }


    public void animateDrawerIndicator(boolean shouldAnimate) {
        ValueAnimator anim;
        if(shouldAnimate) {
            anim = ValueAnimator.ofFloat(0, 1);
        } else {
            anim = ValueAnimator.ofFloat(1, 0);
        }
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                float slideOffset = (Float) valueAnimator.getAnimatedValue();
                // You should get the drawer layout and
                // toggler from your fragment to make the animation
                toggle
                        .onDrawerSlide(drawer,
                                slideOffset);
            }
        });
        anim.setInterpolator(new DecelerateInterpolator());
        anim.setDuration(500);
        anim.start();
    }
}

这里一切正常,但是当用户点击工具栏上的edittext(根据我的代码)时,我将汉堡包图标更改为后退按钮。现在如果用户点击后退按钮,它应该动画回汉堡包并且应该隐藏编辑文本(根据我的要求)

但是,为了实现这一点,我需要处理汉堡包点击。我已尝试onClickListners onggle,actionbartoggle等。但是徒劳无助请帮忙。

2 个答案:

答案 0 :(得分:2)

直接调用ActionBarDrawerToggle的{​​{1}}方法来设置切换设置的动画非常混乱。更好的选择是将onDrawerSlide()设置为切换的向上指示符,并为自己设置动画,根据需要启用和禁用切换的抽屉指示符。

首先,我们在DrawerArrowDrawable

中声明了DrawerArrowDrawable字段
Activity

然后我们在private DrawerArrowDrawable searchToggle; 方法中初始化它,将其设置为向上指示符,并定义导航onCreate()

OnClickListener

searchToggle = new DrawerArrowDrawable(this); toggle.setHomeAsUpIndicator(searchToggle); toggle.setToolbarNavigationClickListener(new OnClickListener() { @Override public void onClick(View v) { hideSearchAndEnableAppName(); } } ); 方法中,如果我们显示搜索animateDrawerIndicator(),我们会先禁用抽屉指示符。这会导致切换恢复为向上指示器,然后我们将根据需要设置动画,一旦隐藏动画结束,切换回抽屉指示器。

EditText

答案 1 :(得分:1)

mDrawerToggle.setDrawerIndicatorEnabled(false); //disable "hamburger to arrow" drawable
    mDrawerToggle.setHomeAsUpIndicator(R.drawable.menu); //set your own
    mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(mDrawerLayout.isDrawerOpen(GravityCompat.START)){
                mDrawerLayout.closeDrawer(GravityCompat.START);
            }else {
                mDrawerLayout.openDrawer(GravityCompat.START);
            }

        }
    });

这是我用我的应用程序在用其他人更改汉堡图标时使用的 当设置图标而不是单击时,因为 我们需要使用:

 mDrawerToggle.setDrawerIndicatorEnabled(false);