Git Product home page Git Product logo

context-menu.android's Introduction

Android Arsenal Yalantis

ContextMenu

You can easily add awesome animated context menu to your app.

Check this project on dribbble

Check this project on Behance

Usage:

For a working implementation, have a look at the app module

1. Clone repository and add sources into your project or use Gradle:

Add it in your root build.gradle at the end of repositories:

	allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}

Add the dependency

	dependencies {
	        implementation 'com.github.Yalantis:Context-Menu.Android:1.1.4'
	}

2. Create list of MenuObject, which consists of icon or icon and description.

You can use any drawable, resource, bitmap, color as image:

    menuObject.drawable = ...
    menuObject.setResourceValue(...)
    menuObject.setBitmapValue(...)
    menuObject.setColorValue(...)

You can set image ScaleType:

    menuObject.scaleType = ScaleType.FIT_XY

You can use any resource, drawable, color as background:

    menuObject.setBgResourceValue(...)
    menuObject.setBgDrawable(...)
    menuObject.setBgColorValue(...)

Now You can easily add text appearance style for menu titles:

	In your project styles create style for text appearance
	(For better visual effect extend it from TextView.DefaultStyle):
	
	<style name="TextViewStyle" parent="TextView.DefaultStyle">
        	<item name="android:textStyle">italic|bold</item>
        	<item name="android:textColor">#26D0EB</item>
	</style>

	And set it's id to your MenuObject :	
    
        val bitmapDrawable = BitmapDrawable(
                resources,
                BitmapFactory.decodeResource(resources, R.drawable.icn_3)
        )

        val menuObject = MenuObject("Add to friends").apply {
            drawable = bitmapDrawable
            menuTextAppearanceStyle = R.style.TextViewStyle
        }

You can use any color as text color:

    menuObject.textColor = ...

You can set any color as divider color:

    menuObject.dividerColor = ...

Example:

    val close = MenuObject().apply { setResourceValue(R.drawable.icn_close) }

    val send = MenuObject("Send message").apply { setResourceValue(R.drawable.icn_1) }
    
    val addFriend = MenuObject("Add to friends").apply {
            drawable = BitmapDrawable(
                    resources,
                    BitmapFactory.decodeResource(resources, R.drawable.icn_3)
            )
    }

    val menuObjects = mutableListOf<MenuObject>().apply {
            add(close)
            add(send)
            add(addFriend)
    }

3. Create newInstance of ContextMenuDialogFragment, which received MenuParams object.

    val menuParams = MenuParams(
    	actionBarSize = resources.getDimension(R.dimen.tool_bar_height).toInt(),
    	menuObjects = getMenuObjects(),
    	isClosableOutside = false
    	// set other settings to meet your needs
    )
    
    // If you want to change the side you need to add 'gravity' parameter,
    // by default it is MenuGravity.END.
    
    // For example:
    
    val menuParams = MenuParams(
    	actionBarSize = resources.getDimension(R.dimen.tool_bar_height).toInt(),
    	menuObjects = getMenuObjects(),
    	isClosableOutside = false,
    	gravity = MenuGravity.START
    )
    
    val contextMenuDialogFragment = ContextMenuDialogFragment.newInstance(menuParams)

4. Set menu with button, which will open ContextMenuDialogFragment.

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        item?.let {
            when (it.itemId) {
                R.id.context_menu -> {
                    showContextMenuDialogFragment()
                }
            }
        }

        return super.onOptionsItemSelected(item)
    }

5. Add menu item listeners.

    contextMenuDialogFragment = menuItemClickListener = { view, position ->
    	// do something here
    }
	    
    contextMenuDialogFragment = menuItemLongClickListener = { view, position ->
    	// do something here
    }

Customization:

For better experience menu item size should be equal to ActionBar height.

newInstance of ContextMenuDialogFragment receives MenuParams object that has the fields:

menuObjects - list of MenuObject objects,

animationDelay - delay in millis after fragment opening and before closing, which will make animation smoother on slow devices,

animationDuration - duration of every piece of animation in millis,

isClosableOutside - if menu can be closed on touch to non-button area,

isFitSystemWindows - if true, then the default implementation of fitSystemWindows(Rect) will be executed,

isClipToPadding - true to clip children to the padding of the group, false otherwise.

The last two parameters may be useful if you use Translucent parameters in your theme:

    <item name="android:windowTranslucentStatus">true</item>

To stay Context Menu below Status Bar set fitSystemWindows to true and clipToPadding to false.

Compatibility

  • Android KitKat 4.4+

Changelog

Version: 1.1.4

  • added background color animation

Version: 1.1.2

  • added animation on close outside menu

Version: 1.1.1

  • bug with menuObject.textColor was fixed

Version: 1.1.0

  • library rewrited on Kotlin
  • added rtl support
  • added gravity parameter for MenuParams

Version: 1.0.8

  • added transparent menu background support
  • dependencies actualized

Version: 1.0.7

  • Text in menu now also clickable
  • Support libs and gradle updated

Version: 1.0.6

  • com.android.tools.build:gradle:1.5.0
  • Support libs and sdk updated to 23

Version: 1.0.5

  • Fixed setClosableOutside issue.
  • Fixed setAnimationDuration doesn´t work for open event issue.
  • Fixed menu item listener setting mechanism. It can be not activity but any class that implements listeners now. Issue. Attention! You have to set listeners to the context fragment manually. Check block 5 in the Usage.

Version: 1.0.4

  • Old ContextMenuDialogFragment newInstance methods are deprecated. Use new universal one that received MenuParams.
  • Added possibility to dismiss menu by clicking on non-button area. See MenuParams.setClosableOutside(boolean).

Version: 1.0.3

  • Added menu text appearence style. (Note: other text style methods are deprecated).

Version: 1.0.2

  • Changed MenuObject constructors. Image setting is moved to methods
  • Added styling of MenuObject image, background, text color, divider color
  • Added possibility to interact with translucent Status Bar

Version: 1.0.1

  • Added OnMenuItemLongClickListener (usage: the same as OnMenuItemClickListener, check sample app)
  • Renamed:
com.yalantis.contextmenu.lib.ContextMenuDialogFragment.ItemClickListener ->
com.yalantis.contextmenu.lib.interfaces.OnMenuItemClickListener

com.yalantis.contextmenu.lib.ContextMenuDialogFragment.ItemClickListener.onItemClick(...) ->
com.yalantis.contextmenu.lib.interfaces.OnMenuItemClickListener.onMenuItemClick(...)

Version: 1.0

  • Pilot version

Let us know!

We’d be really happy if you sent us links to your projects where you use our component. Just send an email to [email protected] And do let us know if you have any questions or suggestion regarding the animation.

P.S. We’re going to publish more awesomeness wrapped in code and a tutorial on how to make UI for Android (iOS) better than better. Stay tuned!

License

Copyright 2019, Yalantis

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

context-menu.android's People

Contributors

alexzaitsev avatar burgerz avatar edbaev avatar kstanislav avatar lynnik avatar matthewrice345 avatar penzk avatar warko-san avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

context-menu.android's Issues

How to use in my android project

Hi Man,
I am very new to Android development. I am not using gradle. Can you please let me know how to include in my project.

  1. When I clone your project to eclipse(Mars) it is showing the following structure-

context menu

  1. my project structure is given below.

my app

Now shall I copy the "lib" folder (lib\src\main...) to my "src" folder?
Normally I add the library like the following way-

adding library
Could you please help me here?

Regards
Biswajit Das

Hi How can we make this menu come to left handside.

Hi great job with this menu component but how do we make it come in left handside of the android device and one more question can we inflate view badger to the menu item if and when we have the notification let me know . Honestly great job Thank you

setAnimationDuration doesn´t work for open event

Hi, great job but i found a bug.
When you set a setAnimationDuration it only apply to close event.

The reason is because MenuAdapter constructor is setting the mAnimationDurationMilis default (100) before the setAnimationDuration has called

;-)

Not able to re-position the dialog.

Hi,
I am not able to re-position the ContextDialogFragmnet.

public void setDialogPosition(ContextMenuDialogFragment mMenuDialogFragment) {
Window window = mMenuDialogFragment.getDialog().getWindow();
window.setGravity(Gravity.BOTTOM | Gravity.LEFT);

    WindowManager.LayoutParams params = window.getAttributes();
    params.y = dpToPx(60);
    window.setAttributes(params);
}

Getting getDialog() is null.

Please let me know how to reposition this dialog as i want to show this dialog along with my custom view or in Center of the screen.

Thanks in advance.

customize

Thanks for your great library. I wish to implement in my app.
I didn´t find on the fly a way to setBackgroundColor instead of white a custom one.
And Theme also changed my transulent StatusBar.

Thanks for attention
Cheers

Change background color of each item

Hi Thanks for your wonderful tutorial.
I have 3 transparent images and want to set a background color of each item. How can I achieve that in your library ?

onMenuItemClick - Another Activity

Hello PenzK and others, LOVE the Context Menu!! I read a previous issue #31 and having a similar issue with the onMenuItemClick, I cannot wrap my head around getting past why I cannot click on the menu item and go to another activity. I read the Check Block 5, but confused where I need to add this (going to use intent) for each menu item. Do I add in Main Activity or the ContextMenuDialogFragment?

Penzk stated to set listeners to the context fragment manually and view Check Block 5 (see below). Where it states below, "...public void onMenuItemClick(View clickedView, int position) {
//Do something here" is this the area I should put my intents?

From Github Check Block 5 it shows Main Activity below:

* Implement OnMenuItemClickListener interface with onMenuItemClick method.*

public class MainActivity extends ActionBarActivity implements OnMenuItemClickListener

@OverRide
public void onMenuItemClick(View clickedView, int position) {
//Do something here
}

mMenuDialogFragment.setItemClickListener(this);

Any additional guidance is GREATLY appreciated. Thank you for your time.

Expandable listview

Hi ,

Thanks for providing nice library...Can we implement expandable listview for this menu??

For example if we click on messages option can we display the sub items like inbox,outbox and send message below the message option.

Full Screen

How can I show this context menu while having full screen layout ?

NPE While Using Library

Following is the Bug Report I got today :

Caused by: java.lang.NullPointerException
at android.os.Parcel.readTypedList(Parcel.java:1749)
at com.yalantis.contextmenu.lib.MenuParams.(MenuParams.java:109)
at com.yalantis.contextmenu.lib.MenuParams.(MenuParams.java:11)
at com.yalantis.contextmenu.lib.MenuParams$1.createFromParcel(MenuParams.java:119)
at com.yalantis.contextmenu.lib.MenuParams$1.createFromParcel(MenuParams.java:117)
at android.os.Parcel.readParcelable(Parcel.java:2103)
at android.os.Parcel.readValue(Parcel.java:1965)

Any Help????

Vector Drawable as Menu icon

It doesn't show vector drawable as menu icon on API 19 with below err:

   Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #1: invalid drawable tag vector
                                                                        at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:933)
                                                                        at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877) 

Change direction rolling view

Thanks for great library. Any way to change direction when rolling view, such as from bottom to top, left to right

Attempt to invoke interface method 'int java.util.List.size()' on a null object reference

Hi!

I used your library 5 months ago and some users get the following error:
java.lang.RuntimeException: Unable to start activity ComponentInfo{hu.nextent.ni.cetli/hu.nextent.ni.cetli.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference

I have no idea why it's happening. Please, if you can help me. Thanks, I'm sending the stacktrace:

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{hu.nextent.ni.cetli/hu.nextent.ni.cetli.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2572)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654)
at android.app.ActivityThread.access$900(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.os.Parcel.readTypedList(Parcel.java:2008)
at com.yalantis.contextmenu.lib.MenuParams.(MenuParams.java:109)
at com.yalantis.contextmenu.lib.MenuParams.(MenuParams.java:11)
at com.yalantis.contextmenu.lib.MenuParams$1.createFromParcel(MenuParams.java:119)
at com.yalantis.contextmenu.lib.MenuParams$1.createFromParcel(MenuParams.java:117)
at android.os.Parcel.readParcelable(Parcel.java:2346)
at android.os.Parcel.readValue(Parcel.java:2243)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2592)
at android.os.BaseBundle.unparcel(BaseBundle.java:221)
at android.os.Bundle.getParcelable(Bundle.java:786)
at com.yalantis.contextmenu.lib.ContextMenuDialogFragment.onCreate(ContextMenuDialogFragment.java:89)
at android.support.v4.app.Fragment.performCreate(Fragment.java:2062)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1051)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1286)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1268)
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:2138)
at android.support.v4.app.FragmentController.dispatchCreate(FragmentController.java:190)
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:349)
at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:85)
at hu.nextent.ni.cetli.MainActivity.onCreate(MainActivity.java:61)
at android.app.Activity.performCreate(Activity.java:6309)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2519)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654)
at android.app.ActivityThread.access$900(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

implements in Fragment

Hi, it is really an awesome animated context menu!!
Thanks!!
But is it possible to implements OnMenuItemClickListener / OnMenuItemLongClickListener in Fragment?

Open menu onLongClick

I wanted to know if I can open this context menu when I long press any item in recycler view?

can i open it from a button?

dont know where can i do questions here , so , can i open this menu using a button and not the actionbar? thx

How can to change rotation of values?

Hi Dear Yalantis

I want to change rotation of items to Horizontally instead Vertically,it means i want to when clicked on + button the Context Menu shows horizontally,additionally do we can the change openning items animation or not?

Respect
Thank you...

Change layout position

Hi,
First of all thank you for making this awesome library, save my time :)
I have problem to customize the view :
how to change layout position, i need to set my image resource on center_horizontal and align to bottom

screen shot 2016-10-29 at 5 40 40 pm

Thank you

Menu icons too small

How can i change this?
I've tried to change the icon sizes programmatically, and they don't work.

How I may obtain a copy of the License?

How could I get the License for usage? I'd like to implement this samples on a application I have been developed for my college and I'd like to use it.

Thanks in advance!

onMenuItemClick is not working in fragments

Hi, Thanks for your wonderful code. I implement your code in fragment instead of activity. Everything is working fine but listeners are not working in fragment.

public class DinningFragment extends Fragment implements OnMenuItemClickListener{

@OverRide
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_dinning, container, false);

}
}

@OverRide
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.settings_menu, menu);
this.menu = menu;
super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.context_menu) {
        if (fragmentManager.findFragmentByTag(ContextMenuDialogFragment.TAG) == null) {
            mMenuDialogFragment.show(fragmentManager, ContextMenuDialogFragment.TAG);
        }

    }
    return super.onOptionsItemSelected(item);
}

@OverRide
public void onMenuItemClick(View clickedView, int position) {
MenuItem item = menu.findItem(R.id.context_menu);
Toast.makeText(this, "Clicked on position: " + position, Toast.LENGTH_SHORT).show();
}
}
Above is my code. I do not receive call in onMenuItemClick.

Please help!!

Option to close menu when user touches the darkened area.

There should be an option to close the menu when the user touches the darkened area since that is the usual behavior for interfaces like this.

An option should be added with the default value of false to keep backwards compatibility.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.