【问题标题】:Xamarin.Android - ToolbarNavigationClickListenerXamarin.Android - ToolbarNavigationClickListener
【发布时间】:2021-02-14 06:35:33
【问题描述】:

我的问题类似于Android - Switch ActionBar Back Button to Navigation Button这个问题,但是我在使用我改成c#的Java代码时遇到了问题。

import android.support.v7.app.ActionBarDrawerToggle
import android.support.v4.widget.DrawerLayout

ActionBarDrawerToggle mDrawerToggle;
DrawerLayout drawerLayout;
private boolean mToolBarNavigationListenerIsRegistered = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setSupportActionBar(mToolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    // Get DrawerLayout ref from layout
    drawerLayout = (DrawerLayout)findViewById(R.id.drawer);
    // Initialize ActionBarDrawerToggle, which will control toggle of hamburger.
    // You set the values of R.string.open and R.string.close accordingly.
    // Also, you can implement drawer toggle listener if you want.
    mDrawerToggle = new ActionBarDrawerToggle (this, drawerLayout, mToolbar, R.string.open, R.string.close);
    // Setting the actionbarToggle to drawer layout
    drawerLayout.addDrawerListener(mDrawerToggle);
    // Calling sync state is necessary to show your hamburger icon...
    // or so I hear. Doesn't hurt including it even if you find it works
    // without it on your test device(s)
    mDrawerToggle.syncState();
}

/**
 * To be semantically or contextually correct, maybe change the name
 * and signature of this function to something like:
 *
 * private void showBackButton(boolean show)
 * Just a suggestion.
 */
 private void enableViews(boolean enable) {

    // To keep states of ActionBar and ActionBarDrawerToggle synchronized,
    // when you enable on one, you disable on the other.
    // And as you may notice, the order for this operation is disable first, then enable - VERY VERY IMPORTANT.
    if(enable) {
        //You may not want to open the drawer on swipe from the left in this case  
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        // Remove hamburger
        mDrawerToggle.setDrawerIndicatorEnabled(false);
        // Show back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        // when DrawerToggle is disabled i.e. setDrawerIndicatorEnabled(false), navigation icon
        // clicks are disabled i.e. the UP button will not work.
        // We need to add a listener, as in below, so DrawerToggle will forward
        // click events to this listener.
        if(!mToolBarNavigationListenerIsRegistered) {
            mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // Doesn't have to be onBackPressed
                    onBackPressed();
                }
            });

            mToolBarNavigationListenerIsRegistered = true;
        }

    } else {
        //You must regain the power of swipe for the drawer. 
        drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);

        // Remove back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        // Show hamburger 
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        // Remove the/any drawer toggle listener
        mDrawerToggle.setToolbarNavigationClickListener(null);
        mToolBarNavigationListenerIsRegistered = false;
    }

    // So, one may think "Hmm why not simplify to:
    // .....
    // getSupportActionBar().setDisplayHomeAsUpEnabled(enable);
    // mDrawer.setDrawerIndicatorEnabled(!enable);
    // ......
    // To re-iterate, the order in which you enable and disable views IS important #dontSimplify.
}

所以我的问题是如何更改按钮导航单击侦听器,从打开导航抽屉的 hambuger 到用于关闭活动的后退按钮。是否可以像java代码一样使用ToolbarNavigationClickListener,如果可以,如何?

【问题讨论】:

  • 您没有尝试将代码从 Java 转换为 c#,而是要完成什么?也许存在更简单的方法。代码错误是什么意思?
  • @Cfun 在错误列表中有一条消息There is no argument given that corresponds to the required formal parameter 'v' of 'View.IOnClickListener.OnClick(View?)' 我试图为参数添加this,就像我在navigationView.SetNavigationItemSelectedListener(this); 上使用它一样。我想要实现的是如何更改导航按钮上的点击侦听器,该按钮最初显示抽屉布局以替换片段。问题是如何使用方法更改onClickListener

标签: c# android xamarin xamarin.android


【解决方案1】:

通过您提供的链接和描述,您似乎想将后退按钮更改为汉堡包图标并为该汉堡包设置点击事件。

在 Xamarin.Android 中,您可以使用 ActionBarDrawerToggle。创建您自己的MyActionBarDrawerToggle

    internal class MyActionBarDrawerToggle : ActionBarDrawerToggle
    {
        NavigationDrawerActivity owner;

        public MyActionBarDrawerToggle (NavigationDrawerActivity activity, DrawerLayout layout, int imgRes, int openRes, int closeRes)
            : base (activity, layout, imgRes, openRes, closeRes)
        {
            owner = activity;
        }

        public override void OnDrawerClosed (View drawerView)
        {
            owner.ActionBar.Title = owner.Title;
            owner.InvalidateOptionsMenu ();
        }

        public override void OnDrawerOpened (View drawerView)
        {
            owner.ActionBar.Title = owner.mDrawerTitle;
            owner.InvalidateOptionsMenu ();
        }
    }

然后为这个布局设置 mDrawerToggle。

    mDrawerToggle = new MyActionBarDrawerToggle (this, mDrawerLayout,
            Resource.Drawable.ic_drawer, 
            Resource.String.drawer_open, 
            Resource.String.drawer_close);

        mDrawerLayout.SetDrawerListener (mDrawerToggle);
        if (savedInstanceState == null) //first launch
            selectItem (0);

为 RecyclerView 创建点击监听器。

public interface OnItemClickListener{
        void OnClick(View view, int position);
    }

然后在布局中实现。

    public void OnClick (View view, int position)
    {
        selectItem (position);
    }

截图:

您可以从链接下载源文件以供参考。

https://docs.microsoft.com/en-us/samples/xamarin/monodroid-samples/android50-navigationdrawer/

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多