टूलबार होम बटन क्लिक इवेंट को नहीं पकड़ सकता


106

मैंने नवीनतम एप्कोमेट लाइब्रेरी को लागू किया है और Toolbarएक्शन बार के रूप में उपयोग किया है । लेकिन समस्या यह है कि मैं होम बटन / हैमबर्गर आइकन क्लिक ईवेंट नहीं पकड़ सकता। मैंने कोशिश की है और सब कुछ देखा है लेकिन एक समान समस्या नहीं लगती है।

यह मेरी Activityकक्षा है:

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);
}

और यह मेरा नेवीगेशनड्रैफग्रैमेंट क्लास है:

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);
}

जब मैंने एक मेनू आइटम पर क्लिक किया, तो लॉग "चयनित आइटम" कहा जाता है। लेकिन जब मैं होम बटन पर क्लिक करता हूं, तो यह नेविगेशन ड्रॉअर खोलता है, लेकिन लॉग "होम सिलेक्टेड" कभी नहीं बुलाया जाता है। मैंने अपने onOptionsItemSelectedअंदर भी विधि निर्धारित की है Activity, लेकिन यह अभी भी नहीं कहा जाता है।

जवाबों:


224

यदि आप जानना चाहते हैं कि घर पर क्लिक कब किया जाता है AppCompatActivityतो आपको इसे इस तरह आज़माना चाहिए:

पहले बताएं कि आप जिस एंड्रॉइड को अपने Toolbarरूप में उपयोग करना चाहते हैं ActionBar:

setSupportActionBar(toolbar);

फिर होम को setDisplayShowHomeEnabledइस तरह से प्रदर्शित करने के लिए सेट करें:

getSupportActionBar().setDisplayShowHomeEnabled(true);

अंत में android.R.id.homeहमेशा की तरह क्लिक इवेंट्स के लिए सुनें :

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

यदि आप जानना चाहते हैं कि नेविगेशन बटन को Toolbarकक्षा में किसी अन्य पर क्लिक किया जाता है , तो AppCompatActivityआप नेविगेशन आइकन सेट करने के लिए इन तरीकों का उपयोग कर सकते हैं और उस पर क्लिक घटनाओं को सुन सकते हैं। नेविगेशन आइकन आपके बाईं ओर दिखाई देगा Toolbarजहां "होम" बटन हुआ करता था।

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");
    }
});

यदि आप जानना चाहते हैं कि हैमबर्गर को कब क्लिक किया जाता है और जब दराज खुलता है, तो आप पहले से ही इन घटनाओं को सुन रहे हैं onDrawerOpenedऔर onDrawerClosedइसलिए आप यह देखना चाहते हैं कि क्या वे कॉलबैक आपकी आवश्यकताओं के अनुरूप हैं।


1
पहले भाग की कोशिश की, लेकिन यह काम नहीं कर रहा है। दूसरे भाग की कोशिश की, और यह काम करता है। अगर मैं नेवी ड्रावर से टूलबार रजिस्टर करता हूं तो आइकन नहीं बदलता है। एक और सवाल, क्या इसके लिए setDrawerIndicatorEnabled के लिए कोई प्रतिस्थापन है? मैंने इस नए नेवी ड्रॉअर और त्रुटि प्राप्त करने की कोशिश की है। धन्यवाद यू
डार्क लियोनहार्ट ३०'१४

दूसरा उपाय काम कर रहा है। लेकिन हम दूसरे समाधान में होम बटन क्लिक और ड्रावर बटन का पता कैसे लगा सकते हैं। जब ड्राअर आइकन पर क्लिक कर रहे हैं, तो यह दराज को नहीं खोल रहा है।
डोरी

2
जब आप टूलबार के लिएNavigationOnClickListener सेट करते हैं तो आप "देशी" दराज व्यवहार खो देते हैं :(
IlyaEremin

7
तो अब हमें एक अलग क्लिक श्रोता की आवश्यकता है जब टुकड़ों में होने से पहले हम android.R.id.home के लिए जाँच कर सकते थे onOptionsItemSelected ()? यह वास्तव में बहुत कष्टप्रद है
डैनियल विल्सन

1
पुन: टूलबार, यदि आप एक नया नेविगेशनऑनलाइनक्लिकस्टैनर सेट करते हैं (setNavigationOnClickListener का उपयोग करके) तो आप अपने एक्शनवार्डरवेटरटॉगल के साथ फिर से सेटड्रॉलरलिंटर को कॉल करके उपयुक्त होने पर नवड्रावर को पुनः स्थापित कर सकते हैं।
आवारा

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

mycase में यह कोड सही काम करता है


आप वास्तव में महान हैं, यह काम किया है, मैंने कभी नहीं सोचा था कि मैं टूलबार के माध्यम से टूलबार बैक बटन को संभालने में सक्षम हो सकता हूं ..
साई

ActionBarDrawerToggle.setToolbarNavigationClickListener को काम करने के लिए पहले एक को यह कॉल करना होगा: mActionBarDrawerToggle.setHomeAsUpIndicator (R.ableable.menu_icon); mActionBarDrawerToggle.setDrawerIndicatorEnabled (गलत); और स्वयं क्लिक घटनाओं का प्रबंधन करें। (ओपन / क्लोज़ ड्रॉअर ऑन क्लिक)
luky

10

यह है कि मैं इसे सही टुकड़े पर लौटने के लिए कैसे करता हूं अन्यथा यदि आपके पास एक ही स्तर पर कई टुकड़े हैं तो यह पहले वाले पर वापस आ जाएगा यदि आप टूलबार बैक बटन व्यवहार को ओवरराइड नहीं करते हैं।

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

क्या हमारे पास कोटलिन में "ओवरराइड" क्लिक विधि है?
अखिला मदारी

@AkhilaMadari ने कोटलिन में कुछ इस तरह की कोशिश की: val toolbar = findViewById (R.id.toolbar) टूलबार के रूप में setSupportActionBar (टूलबार) toolbar.setNavigationOnickickististist {/ * कुछ आप चाहते हैं * / ()}
मार्कोस

3

मुझे लगता है कि समर्थन पुस्तकालय 21 के साथ सही समाधान निम्नलिखित है

// 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                          
        }                       
    });                 
}

में this.getResValues().homeIconDrawable(), कौन है this?
लुइसकॉमएस

यह एक गतिविधि है। Getresvalues ​​मेरी विधि है, इसलिए यहां प्रासंगिक नहीं है। सेटलोगो एक ड्रा करने योग्य संसाधन आईडी को स्वीकार करता है।
ikić Nenad

4
यह उपयोगकर्ता को पूरे टूलबार पर किसी भी स्थान पर क्लिक करने में मदद करेगा, मुझे यह नहीं लगता कि वह इस बारे में क्या पूछ रहा था
मीना फवजी

1

जैसे नेविगेशन ड्रावर में मैंने वापस और होम बटन संभाला है

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);
    }
}

(और प्रत्येक में onViewCreatedमैं फोन करता हूं

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

0

इस तरह मैंने इसे प्री-मटेरियल डिज़ाइन को लागू किया और यह अभी भी काम कर रहा है कि अब मैंने नया स्विच किया है Toolbar। मेरे मामले में मैं उपयोगकर्ता को लॉग इन करना चाहता हूं यदि वे लॉग आउट करते समय साइड नेवी को खोलने का प्रयास करते हैं, और इवेंट को पकड़ते हैं तो साइड नेवी ओपन नहीं होगी)। आपके मामले में आप नहीं कर सकते 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);
}

आह मैं भूल गया मुझे पता चला कि मैं एक टुकड़े में होम बटन क्लिक को पकड़ने में असमर्थ था, मैंने यहां एक प्रश्न पूछा और एक वर्कअराउंड का सुझाव दिया जो मैन्युअल रूप से आपके सभी टुकड़ों पर घटना को पारित करना था। stackoverflow.com/q/21938419/1007151
darnmason

0

मैंने घटनाओं को प्राप्त करने और उपभोग करने और घटना करने में सक्षम होने के लिए ड्रॉयरलैट को थोड़ा बदल दिया, जैसे कि यदि आप एक्शनटॉगल का उपयोग करना चाहते हैं जैसे कि आप विस्तार से देख सकते हैं:

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

सबसे आसान तरीका जो हम कर सकते हैं वह है होम आइकॉन को एक ज्ञात आइकॉन में बदलना और ड्रॉबल्स की तुलना करना (क्योंकि android.R.id.home आइकन अलग-अलग एपीआई संस्करणों में भिन्न हो सकता है

इसलिए एक्शनबार सेटसुपोर्टएशनबार (_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

मेरे मामले में मुझे आइकन का उपयोग करना पड़ा:

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

और फिर डिफ़ॉल्ट onOptionsItemSelected और android.R.id.home आईडी के साथ घटनाओं पर क्लिक करने के लिए सुनो


1
यह काम नहीं करेगा। android.R.id.homeआग कभी नहीं
Trancer

0

किसी Xamarin कार्यान्वयन की तलाश में किसी के लिए (चूंकि घटनाओं को C # में अलग-अलग तरीके से किया जाता है), मैंने बस इस NavClickHandlerवर्ग को इस प्रकार बनाया है:

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);
        }
    }
}

फिर, इस तरह एक कस्टम हैमबर्गर मेनू बटन सौंपा:

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

और अंत में, मैं पहले बनाए गए वर्ग प्रकार का एक टूलबारनैक्शनविज़नक्लिकर के लिए दराज मेनू टॉगलर सौंपा।

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

और फिर आपको एक कस्टम मेनू बटन मिला है, जिसमें क्लिक की गई घटनाओं को नियंत्रित किया गया है।


0

इस कोड को आज़माएं

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

नीचे दिए गए कोड को अपने onCreate () मेट्रो में जोड़ें

ActionBar ab = getSupportActionBar();
    ab.setDisplayHomeAsUpEnabled(true);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.