Introduction
A non-visible extension to show context menus for your components. A context menu is a popup containing features to autofill, copy, paste, cut, etc.
Note that I have no guarantee that the context menu will 100% show. The best way is to set the component selectable, then show the context menu. Even Google is aware of this, so the TextView.showContextMenu
function is not void, but boolean.
Release date:
Version: 1
Package name: com.gordonlu.contextmenu
Built with: Niotron IDE
Recommended Android version: Nougat 7.0
Documentation
Event blocks
OnFinish
This event is fired when the action is completed. The isCustom parameter identifies whether the action is showing an advanced context menu, and the successful parameter is whether the action is successfully completed.
Parameters: isAdvanced = boolean, successful = boolean
Method blocks
SetSelectable
Sets the component's text selectable by the user.
Parameters: component = component
ShowAdvancedContextMenu
Shows the advanced context menu for this component and fires the OnFinish event for whether it is successful. What's different from ShowContextMenu is that you can specify the x and y position of the context menu. This function will require devices with Android versions larger or 7.0.
Parameters: component = component, x = number (float), y = number (float)
ShowContextMenu
Shows a simple context menu for the given component.
Parameters: component = component
What does a context menu look like?
These are screenshots of sample context menus. Order: Classic, Device Default, Dark.
If you want a custom context menu, use the DaffyMenu extension to build your own.
Open Source
Here you go.
package com.gordonlu.contextmenu;
import android.app.Activity;
import android.content.Context;
import com.google.appinventor.components.annotations.*;
import com.google.appinventor.components.common.ComponentCategory;
import com.google.appinventor.components.runtime.AndroidNonvisibleComponent;
import com.google.appinventor.components.runtime.ComponentContainer;
import com.google.appinventor.components.runtime.EventDispatcher;
import com.google.appinventor.components.runtime.AndroidViewComponent;
import android.widget.TextView;
import android.view.View;
import androidx.annotation.RequiresApi;
@DesignerComponent(
version = 1,
description = "A non-visible extension to show the context menu of your components.<br><br>Made by Gordon Lu (AICODE).",
category = ComponentCategory.EXTENSION,
nonVisible = true,
iconName = "https://docs.google.com/drawings/d/e/2PACX-1vQCI87PHLBF0jb8QWyYmIRQSjjNW3EFXf-qpsWCvBYkUQ9vEgPAB8SpxcMpblxNpbIYrjCjLrRLIU2c/pub?w=16&h=16")
@SimpleObject(external = true)
//Libraries
@UsesLibraries(libraries = "")
//Permissions
@UsesPermissions(permissionNames = "")
public class ContextMenu extends AndroidNonvisibleComponent {
//Activity and Context
private Context context;
private Activity activity;
public ContextMenu(ComponentContainer container){
super(container.$form());
this.activity = container.$context();
this.context = container.$context();
}
@SimpleFunction(description = "Shows the context menu for this component and fires the OnFinish event for whether it is successful.")
public void ShowContextMenu (AndroidViewComponent component) {
View view = component.getView();
TextView tv = (TextView) view;
boolean test = tv.showContextMenu();
OnFinish(false, test);
}
@RequiresApi(api = 24)
@SimpleFunction(description = "Shows the advanced context menu for this component and fires the OnFinish event for whether it is successful." +
" What's different from ShowContextMenu is that you can specify the x and y position of the context menu. This function will require devices with Android" +
" versions larger or 7.0.")
public void ShowAdvancedContextMenu (AndroidViewComponent component, float x, float y) {
View view = component.getView();
TextView tv = (TextView) view;
boolean test = tv.showContextMenu(x, y);
OnFinish(true, test);
}
@SimpleEvent(description = "This event is fired when the action is completed. The isAdvanced parameter identifies whether the action is"
+ " showing an advanced context menu, and the successful parameter is whether the action is successfully completed.")
public void OnFinish(boolean isAdvanced, boolean successful) {
EventDispatcher.dispatchEvent(this, "OnFinish", isAdvanced, successful);
}
@SimpleFunction(description = "Sets the component's text selectable by the user.")
public void SetSelectable(AndroidViewComponent component) {
View view = component.getView();
TextView tv = (TextView) view;
tv.setTextIsSelectable(true);
}
}
Downloads
AIX:
com.gordonlu.contextmenu.aix (7.5 KB)
Made with Niotron IDE.
Kindly PM me if you have any questions! Also, if you like my extension, please like it! It takes some effort for me to make it...
Likes tell me the general user feedback of my extension. If you read this extension, please take 20 seconds to drop by and give a like!
If you have any features that you want to add and you know the code, PM me or directly reply below using the button.
If you find any bugs, please reply below.
Feature requests?
I currently have a lot of work to do, because I am currently working on 4 different extensions and I have problems in real life (i.e. English debate competition). If you have feature requests, please consider whether this is important, because I do not have a lot of time, but I may hang out in the community.
Gordon Lu