I've recently noticed that when a link is opened in some of few Android apps, they have this similar look and feel and the custom action menus with the "Powered by Chrome" below the custom menu. What component is used in this or is it still the Chromium WebView
? Hopefully I'm looking to add them to my next projects which involve opening link inside an app.
LinkedIn App
Twitter App
GMail App
# Open a WebView in DevToolsThe chrome://inspect page displays a list of debug-enabled WebViews on your device. To start debugging, click inspect below the WebView you want to debug. Use DevTools as you would for a remote browser tab.
Alternatives to WebView If you want to send users to a mobile site, build a progressive web app (PWA). If you want to display third-party web content, send an intent to installed web browsers. If you want to avoid leaving your app to open the browser, or if you want to customize the browser's UI, use Custom Tabs.
Modify src/MainActivity. java file to add WebView code. Run the application and choose a running android device and install the application on it and verify the results. Following is the content of the modified main activity file src/MainActivity.
No, Chrome for Android is separate from WebView. They're both based on the same code, including a common JavaScript engine and rendering engine.
It is Chrome Custom Tabs. You can see the sample code from Google Chrome here.
Try the following util class:
public class CustomTabs {
private static final int TOOLBAR_SHARE_ITEM_ID = 1;
public static void openTab(Context context, String url) {
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
enableUrlBarHiding(builder);
setToolbarColor(context, builder);
setSecondaryToolbarColor(context, builder);
setCloseButtonIcon(context, builder);
setShowTitle(builder);
setAnimations(context, builder);
setShareActionButton(context, builder, url);
addToolbarShareItem(context, builder, url);
addShareMenuItem(builder);
addCopyMenuItem(context, builder);
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(context, Uri.parse(url));
}
/* Enables the url bar to hide as the user scrolls down on the page */
private static void enableUrlBarHiding(CustomTabsIntent.Builder builder) {
builder.enableUrlBarHiding();
}
/* Sets the toolbar color */
private static void setToolbarColor(Context context, CustomTabsIntent.Builder builder) {
builder.setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary));
}
/* Sets the secondary toolbar color */
private static void setSecondaryToolbarColor(Context context, CustomTabsIntent.Builder builder) {
builder.setSecondaryToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary));
}
/* Sets the Close button icon for the custom tab */
private static void setCloseButtonIcon(Context context, CustomTabsIntent.Builder builder) {
builder.setCloseButtonIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_arrow_back));
}
/* Sets whether the title should be shown in the custom tab */
private static void setShowTitle(CustomTabsIntent.Builder builder) {
builder.setShowTitle(true);
}
/* Sets animations */
private static void setAnimations(Context context, CustomTabsIntent.Builder builder) {
builder.setStartAnimations(context, R.anim.slide_in_right, R.anim.slide_out_left);
builder.setExitAnimations(context, R.anim.slide_in_left, R.anim.slide_out_right);
}
/* Sets share action button that is displayed in the Toolbar */
private static void setShareActionButton(Context context, CustomTabsIntent.Builder builder, String url) {
Bitmap icon = BitmapFactory.decodeResource(context.getResources(), android.R.drawable.ic_menu_share);
String label = "Share via";
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_TEXT, url);
shareIntent.setType("text/plain");
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, shareIntent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setActionButton(icon, label, pendingIntent);
}
/* Adds share item that is displayed in the secondary Toolbar */
private static void addToolbarShareItem(Context context, CustomTabsIntent.Builder builder, String url) {
Bitmap icon = BitmapFactory.decodeResource(context.getResources(), android.R.drawable.ic_menu_share);
String label = "Share via";
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_TEXT, url);
shareIntent.setType("text/plain");
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, shareIntent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.addToolbarItem(TOOLBAR_SHARE_ITEM_ID, icon, label, pendingIntent);
}
/* Adds a default share item to the menu */
private static void addShareMenuItem(CustomTabsIntent.Builder builder) {
builder.addDefaultShareMenuItem();
}
/* Adds a copy item to the menu */
private static void addCopyMenuItem(Context context, CustomTabsIntent.Builder builder) {
String label = "Copy";
Intent intent = new Intent(context, CopyBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.addMenuItem(label, pendingIntent);
}
public static class CopyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String url = intent.getDataString();
ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData data = ClipData.newPlainText("Link", url);
clipboardManager.setPrimaryClip(data);
Toast.makeText(context, "Copied " + url, Toast.LENGTH_SHORT).show();
}
}
}
Don't forget to add the dependencies to your app/build.gradle
dependencies {
...
compile 'com.android.support:customtabs:25.2.0'
}
and register your BroadcastReceiver
in your AndroidManifest.xml
<application>
...
<receiver android:name=".CustomTabs$CopyBroadcastReceiver" />
</application>
Here is the animation xml:
slide_in_left.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="100%p" android:toXDelta="0%p"
android:duration="@android:integer/config_longAnimTime"
android:interpolator="@android:anim/overshoot_interpolator" />
slide_in_right.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-100%p" android:toXDelta="0%p"
android:duration="@android:integer/config_longAnimTime"
android:interpolator="@android:anim/overshoot_interpolator" />
slide_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0" android:toXDelta="-100%p"
android:duration="@android:integer/config_longAnimTime"
android:interpolator="@android:anim/overshoot_interpolator" />
slide_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0" android:toXDelta="100%p"
android:duration="@android:integer/config_longAnimTime"
android:interpolator="@android:anim/overshoot_interpolator" />
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With