Araç çubuğu ana sayfa düğmesi tıklama etkinliği yakalanamıyor


106

En yeni appcompat kitaplığını uyguladım ve Toolbaras eylem çubuğunu kullandım. Ama sorun şu ki, ana sayfa düğmesi / hamburger simgesi tıklama olayını yakalayamıyorum. Her şeyi denedim ve aradım ama benzer bir sorun bulamadım.

Bu benim Activitysınıfım:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    // Set up the drawer.
    navDrawerFragment = 
        (NavigationDrawerFragment) getSupportFragmentManager()
        .findFragmentById(R.id.navigation_drawer);
    navDrawerFragment.setUp(
        R.id.navigation_drawer, 
        (DrawerLayout) findViewById(R.id.drawer_layout), 
        toolbar);
}

Ve bu benim NavigationDrawerFragment sınıfım:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        currentSelectedPosition = savedInstanceState.getInt(
            STATE_SELECTED_POSITION);
        fromSavedInstanceState = true;
    }

    // Select either the default item (0) or the last selected item.
    selectItem(currentSelectedPosition);
}

@Override
public void onActivityCreated (Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // Indicate that this fragment would like 
    // to influence the set of actions in the action bar.
    setHasOptionsMenu(true);
}

public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        drawerListView = (ListView) inflater.inflate(
            R.layout.fragment_navigation_drawer, container, false);
        drawerListView.setOnItemClickListener(
            new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, 
                View view, int position, long id) {
                selectItem(position);
            }
        });
        //mDrawerListView.setAdapter();
        //mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
        return drawerListView;
}

public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
    fragmentContainerView = getActivity().findViewById(fragmentId);
    this.drawerLayout = drawerLayout;

    // set a custom shadow that overlays the main 
    // content when the drawer opens
    drawerLayout.setDrawerShadow(
        R.drawable.drawer_shadow, GravityCompat.START);
    // set up the drawer's list view 
    // with items and click listener

    ActionBar actionBar = getActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeButtonEnabled(true);

    // ActionBarDrawerToggle ties together the the proper interactions
    // between the navigation drawer and the action bar app icon.
    drawerToggle = new ActionBarDrawerToggle(
        getActivity(), 
        drawerLayout, 
        toolbar, 
        R.string.navigation_drawer_open, 
        R.string.navigation_drawer_close) {
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
        }

        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
        }
    };

    // If the user hasn't 'learned' about the drawer, 
    // open it to introduce them to the drawer,
    // per the navigation drawer design guidelines.
    if (!userLearnedDrawer && !fromSavedInstanceState) {
        drawerLayout.openDrawer(fragmentContainerView);
    }

    // Defer code dependent on restoration of previous instance state.
    drawerLayout.post(new Runnable() {
        @Override
        public void run() {
            drawerToggle.syncState();
        }
    });

    drawerLayout.setDrawerListener(drawerToggle);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt(STATE_SELECTED_POSITION, currentSelectedPosition);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Forward the new configuration the drawer toggle component.
    drawerToggle.onConfigurationChanged(newConfig);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Log.d("cek", "item selected");
    if (drawerToggle.onOptionsItemSelected(item)) {
        Log.d("cek", "home selected");
        return true;
    }

    return super.onOptionsItemSelected(item);
}

bir menü öğesini tıkladığımda, "öğe seçildi" günlüğü çağrılıyor. Ancak ana sayfa düğmesine tıkladığımda, gezinme çekmecesini açıyor ancak "ev seçildi" günlüğü hiçbir zaman aranmıyor. Benim içinde de onOptionsItemSelectedyöntem belirledim Activity, ama yine de çağrılmıyor.

Yanıtlar:


224

Ana sayfaya ne zaman tıklandığını bilmek istiyorsanız, şu şekilde AppCompatActivitydenemelisiniz:

Öncelikle Android'inizi sizin Toolbarolarak kullanmak istediğinizi söyleyin ActionBar:

setSupportActionBar(toolbar);

Ardından Ana Sayfa'yı şu şekilde görüntülenecek şekilde ayarlayın setDisplayShowHomeEnabled:

getSupportActionBar().setDisplayShowHomeEnabled(true);

Son olarak, android.R.id.homeher zamanki gibi tıklama etkinliklerini dinleyin :

@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
    if (menuItem.getItemId() == android.R.id.home) {
        Timber.d("Home pressed");
    }
    return super.onOptionsItemSelected(menuItem);
}

Sizden Toolbarbaşka bir sınıftaki gezinme düğmesinin ne zaman tıklandığını bilmek AppCompatActivityistiyorsanız, bir gezinme simgesi ayarlamak ve üzerindeki tıklama olaylarını dinlemek için bu yöntemleri kullanabilirsiniz. Gezinme simgesi, Toolbareskiden "ev" düğmesinin bulunduğu yerin sol tarafında görünecektir .

toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_nav_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.d("cek", "home selected");
    }
});

Hamburgerin ne zaman tıklandığını ve çekmecenin ne zaman açıldığını bilmek istiyorsanız, bu olayları zaten dinliyorsunuz onDrawerOpenedve onDrawerClosedbu geri aramaların gereksinimlerinize uyup uymadığını görmek isteyeceksiniz.


1
İlk bölümü daha önce denedim ama işe yaramıyor. İkinci bölümü denedim ve işe yarıyor. Ancak araç çubuğunu gezinme çekmecesine kaydedersem simge değişmez. Bir soru daha, bunun için setDrawerIndicatorEnabled'ın yerini alacak bir şey var mı? Bu yeni gezinti çekmecesini denedim ve hata alıyorum. Teşekkür ederim
Dark Leonhart

İkinci çözüm çalışıyor. Ancak ikinci çözümde ana sayfa düğmesi ve çekmece düğmesini nasıl tespit edebiliriz. Çekmece simgesine tıkladığımda çekmece açılmıyor.
Dory

2
Araç çubuğu içinNavigationOnClickListener'ı ayarladığınızda, "yerel" çekmece davranışını kaybedersiniz :(
IlyaEremin

7
Öyleyse şimdi ayrı bir tıklama dinleyicisine ihtiyacımız var, daha önce parçalarda android.R.id.home'da onOptionsItemSelected ()? Bu gerçekten çok sinir bozucu
Daniel Wilson

1
re: Araç Çubuğu, yeni bir NavigationOnClickListener ayarlarsanız (setNavigationOnClickListener kullanarak), NavDrawer'ı daha sonra uygun olduğunda ActionBarDrawerToggle'ınızla setDrawerListener'ı yeniden çağırarak eski haline getirebilirsiniz.
straya

24
    mActionBarDrawerToggle = mNavigationDrawerFragment.getActionBarDrawerToggle();
    mActionBarDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // event when click home button
        }
    });

benim durumumda bu kod mükemmel çalışıyor


Gerçekten harikasın, işe yaradı, DrawerToggle aracılığıyla araç çubuğu geri düğmesini kullanabileceğimi hiç düşünmemiştim ..
Sai

ActionBarDrawerToggle.setToolbarNavigationClickListener'ın çalışması için önce şunu çağırmanız gerekir: mActionBarDrawerToggle.setHomeAsUpIndicator (R.drawable.menu_icon); mActionBarDrawerToggle.setDrawerIndicatorEnabled (false); ve tıklama olaylarını kendisi yönetin. (çekmeceyi aç / kapat)
luky

11

Doğru parçaya dönmek için böyle yapıyorum, aksi takdirde aynı seviyede birkaç parçanız varsa, araç çubuğu geri düğmesi davranışını geçersiz kılmazsanız, ilkine geri döner.

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            finish();
        }
    });

Kotlin'de "Geçersiz Kılma" tıklama Yöntemimiz var mı?
Akhila Madari

@AkhilaMadari Kotlin'de buna benzer bir şey deneyin: val toolbar = findViewById (R.id.toolbar) Toolbar setSupportActionBar (araç çubuğu) toolbar.setNavigationOnClickListener {/ * istediğiniz bir şeyi yapın * / finish ()}
Marcos,

3

Destek kitaplığı 21 ile doğru çözümün aşağıdaki gibi olduğunu düşünüyorum

// action_bar is def resource of appcompat; 
// if you have not provided your own toolbar I mean  
Toolbar toolbar = (Toolbar) findViewById(R.id.action_bar);
if (toolbar != null) {
    // change home icon if you wish
    toolbar.setLogo(this.getResValues().homeIconDrawable());
    toolbar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //catch here title and home icon click                          
        }                       
    });                 
}

içinde this.getResValues().homeIconDrawable(), kim this?
LuisComS

Bu bir faaliyettir. Getresvalues ​​benim yöntemimdir, bu yüzden burada önemi yoktur. Setlogo, çekilebilir bir kaynak kimliği kabul eder.
Čikić Nenad

4
bu, tüm araç çubuğundaki herhangi bir yerde kullanıcı tıklamasını işleyecektir, sorduğu şeyin bu olduğunu sanmıyorum
Mina Fawzy

1

Gezinme Çekmecesinde geri ve Ana düğmeyi şu şekilde işledim:

public class HomeActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
    private ActionBarDrawerToggle drawerToggle;
    private DrawerLayout drawerLayout;
    NavigationView navigationView;
    private Context context;

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

        setContentView(R.layout.activity_home);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        resetActionBar();

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

        //showing first fragment on Start
        getSupportFragmentManager().beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).replace(R.id.content_fragment, new FirstFragment()).commit();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //listener for home
        if(id==android.R.id.home)
        {  
            if (getSupportFragmentManager().getBackStackEntryCount() > 0)
                onBackPressed();
            else
                drawerLayout.openDrawer(navigationView);
            return  true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {
       if (drawerLayout.isDrawerOpen(GravityCompat.START)) 
            drawerLayout.closeDrawer(GravityCompat.START);
       else 
            super.onBackPressed();
    }

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Begin the transaction

        Fragment fragment = null;
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (id == R.id.nav_companies_list) {
            fragment = new FirstFragment();
            // Handle the action
        } 


        // Begin the transaction
        if(fragment!=null){

            if(item.isChecked()){
                if(getSupportFragmentManager().getBackStackEntryCount()==0){
                    drawer.closeDrawers();
            }else{
                    removeAllFragments();
                    getSupportFragmentManager().beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE).replace(R.id.WikiCompany, fragment).commit();
                    drawer.closeDrawer(GravityCompat.START);
                }

            }else{
                removeAllFragments();
                getSupportFragmentManager().beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE).replace(R.id.WikiCompany, fragment).commit();
                drawer.closeDrawer(GravityCompat.START);
            }
        }

        return true;
    }

    public void removeAllFragments(){
        getSupportFragmentManager().popBackStackImmediate(null,
                FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

    public void replaceFragment(final Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .replace(R.id.WikiCompany, fragment).addToBackStack("")
                .commit();
    }


    public void updateDrawerIcon() {
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                try {
                    Log.i("", "BackStackCount: " + getSupportFragmentManager().getBackStackEntryCount());
                    if (getSupportFragmentManager().getBackStackEntryCount() > 0)
                        drawerToggle.setDrawerIndicatorEnabled(false);
                    else
                        drawerToggle.setDrawerIndicatorEnabled(true);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }, 50);
    }

    public void resetActionBar()
    {
        //display home
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
    }

    public void setActionBarTitle(String title) {
        getSupportActionBar().setTitle(title);
    }
}

ve her onViewCreatedaradığımda

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ((HomeActivity)getActivity()).updateDrawerIcon();
    ((HomeActivity) getActivity()).setActionBarTitle("List");
}

0

Materyal öncesi tasarımı bu şekilde uyguladım ve hala işe yarıyor gibi görünüyor şimdi yenisine geçtim Toolbar. Benim durumumda, oturum kapalıyken yan gezinmeyi açmaya çalışırlarsa (ve yan gezinme açılmayacak şekilde olayı yakalarlarsa) kullanıcının oturum açmasını istiyorum. Senin durumunda yapamazsın return true;.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (!isLoggedIn() && item.getItemId() == android.R.id.home) {
        login();
        return true;
    }
    return mDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
}

Ah unuttum Bir parçada ana sayfa düğmesini tıklamayı yakalayamadığımı keşfettim, burada bir soru sordum ve olayı tüm parçalarınıza manuel olarak aktaracak bir geçici çözüm önerdim. stackoverflow.com/q/21938419/1007151
darnmason

0

DrawerLayout'u biraz değiştirdim, olayları almak ve örneğin actionToggle'ı geri olarak kullanmak istiyorsanız, ayrıntı görünümündeyseniz:

public class ListenableDrawerLayout extends DrawerLayout {

    private OnToggleButtonClickedListener mOnToggleButtonClickedListener;
    private boolean mManualCall;

    public ListenableDrawerLayout(Context context) {
        super(context);
    }

    public ListenableDrawerLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ListenableDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * Sets the listener for the toggle button
     *
     * @param mOnToggleButtonClickedListener
     */
    public void setOnToggleButtonClickedListener(OnToggleButtonClickedListener mOnToggleButtonClickedListener) {
        this.mOnToggleButtonClickedListener = mOnToggleButtonClickedListener;
    }

    /**
     * Opens the navigation drawer manually from code<br>
     * <b>NOTE: </b>Use this function instead of the normal openDrawer method
     *
     * @param drawerView
     */
    public void openDrawerManual(View drawerView) {
        mManualCall = true;
        openDrawer(drawerView);
    }

    /**
     * Closes the navigation drawer manually from code<br>
     * <b>NOTE: </b>Use this function instead of the normal closeDrawer method
     *
     * @param drawerView
     */
    public void closeDrawerManual(View drawerView) {
        mManualCall = true;
        closeDrawer(drawerView);
    }


    @Override
    public void openDrawer(View drawerView) {

        // Check for listener and for not manual open
        if (!mManualCall && mOnToggleButtonClickedListener != null) {

            // Notify the listener and behave on its reaction
            if (mOnToggleButtonClickedListener.toggleOpenDrawer()) {
                return;
            }

        }
        // Manual call done
        mManualCall = false;

        // Let the drawer layout to its stuff
        super.openDrawer(drawerView);
    }

    @Override
    public void closeDrawer(View drawerView) {

        // Check for listener and for not manual close
        if (!mManualCall && mOnToggleButtonClickedListener != null) {

            // Notify the listener and behave on its reaction
            if (mOnToggleButtonClickedListener.toggleCloseDrawer()) {
                return;
            }

        }
        // Manual call done
        mManualCall = false;

        // Let the drawer layout to its stuff
        super.closeDrawer(drawerView);
    }

    /**
     * Interface for toggle button callbacks
     */
    public static interface OnToggleButtonClickedListener {

        /**
         * The ActionBarDrawerToggle has been pressed in order to open the drawer
         *
         * @return true if we want to consume the event, false if we want the normal behaviour
         */
        public boolean toggleOpenDrawer();

        /**
         * The ActionBarDrawerToggle has been pressed in order to close the drawer
         *
         * @return true if we want to consume the event, false if we want the normal behaviour
         */
        public boolean toggleCloseDrawer();
    }

}

0

Yapabileceğimiz en kolay yaklaşım, ev simgesini bilinen bir simgeyle değiştirmek ve çekilebilir öğeleri karşılaştırmaktır (çünkü android.R.id.home simgesi, farklı api sürümlerinden farklı olabilir.

bu yüzden bir araç çubuğunu eylem çubuğu olarak ayarlayın SetSupportActionBar (_toolbar);

_toolbar.NavigationIcon = your_known_drawable_here;

   for (int i = 0; i < _toolbar.ChildCount; i++)
            {
                View v = _toolbar.GetChildAt(i);
                if (v is ImageButton)
                {
                    ImageButton imageButton = v as ImageButton;

                    if (imageButton.Drawable.GetConstantState().Equals(_bookMarkIcon.GetConstantState()))
                    {
                       //here v is the widget that contains the home  icon you can add your click events here 
                    }
                }
            }

0

Benim durumumda simgeyi şunu kullanarak koymak zorunda kaldım:

toolbar.setNavigationIcon(R.drawable.ic_my_home);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);

Ardından, varsayılan onOptionsItemSelected ve android.R.id.home kimliğine sahip tıklama olaylarını dinleyin


1
Bu işe yaramayacak. android.R.id.homenever fire
Trancer

0

Bir Xamarin uygulaması arayan herkes için (olaylar C # 'da farklı şekilde yapıldığından), bu NavClickHandlersınıfı aşağıdaki gibi oluşturdum :

public class NavClickHandler : Java.Lang.Object, View.IOnClickListener
{
    private Activity mActivity;
    public NavClickHandler(Activity activity)
    {
        this.mActivity = activity;
    }
    public void OnClick(View v)
    {
        DrawerLayout drawer = (DrawerLayout)mActivity.FindViewById(Resource.Id.drawer_layout);
        if (drawer.IsDrawerOpen(GravityCompat.Start))
        {
            drawer.CloseDrawer(GravityCompat.Start);
        }
        else
        {
            drawer.OpenDrawer(GravityCompat.Start);
        }
    }
}

Ardından, aşağıdaki gibi özel bir hamburger menü düğmesi atayın:

        SupportActionBar.SetDisplayHomeAsUpEnabled(true);
        SupportActionBar.SetDefaultDisplayHomeAsUpEnabled(false);
        this.drawerToggle.DrawerIndicatorEnabled = false;
        this.drawerToggle.SetHomeAsUpIndicator(Resource.Drawable.MenuButton);

Ve son olarak, çekmece menüsüne, daha önce oluşturduğum sınıf türünün bir ToolbarNavigationClickListener'ı ataması:

        this.drawerToggle.ToolbarNavigationClickListener = new NavClickHandler(this);

Ve sonra, işlenen tıklama olaylarının olduğu özel bir menü düğmeniz var.


0

Bu kodu dene

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if(id == android.R.id.home){
        //You can get 
    }
    return super.onOptionsItemSelected(item);
}

OnCreate () metodunuza aşağıdaki kodu ekleyin

ActionBar ab = getSupportActionBar();
    ab.setDisplayHomeAsUpEnabled(true);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.