Markdown Text for Android Jetpack Compose 📋.

Overview

MarkdownText - Jetpack Compose

Android CI

demo.mp4
  • Markdown
  • HTML
  • Image
  • Highlight
  • Linkfy
  • Table

Setup

Configure root build.gradle:

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

Add dependency into build.gradle:

dependencies {  
    implementation 'com.github.jeziellago:compose-markdown:TAG'  
}  

Supported attributes

Most of the attributes of that a default Text composable has are also supported by MarkdownText.

  • color
  • fontSize
  • textAlign
  • maxLines
  • style (only styling for supported attributes is applied)

The font can be changed by passing a font xml resource as fontResource parameter.

How to use

Google """ //Minimal example @Composable fun MinimalExampleContent() { MarkdownText(markdown = markdownContent) } //Complex example @Composable fun ComplexExampleContent() { MarkdownText( modifier = Modifier.padding(8.dp), markdown = markdown, textAlign = TextAlign.Center, fontSize = 12.sp, color = LocalContentColor.current, maxLines = 3, fontResource = R.font.montserrat_medium, style = MaterialTheme.typography.overline, ) } ">
val markdown = """  
	# Sample  
	* Markdown  
	* [Link](https://example.com)  
	![Image](https://example.com/img.png)  
	Google  
"""

//Minimal example
@Composable  
fun MinimalExampleContent() {  
    MarkdownText(markdown = markdownContent)  
} 

//Complex example
@Composable  
fun ComplexExampleContent() {  
     MarkdownText(
                modifier = Modifier.padding(8.dp),
                markdown = markdown,
                textAlign = TextAlign.Center,
                fontSize = 12.sp,
                color = LocalContentColor.current,
                maxLines = 3,
                fontResource = R.font.montserrat_medium,
                style = MaterialTheme.typography.overline,
              
     )  
}  

License

Copyright (c) 2021 Jeziel Lago  
  
Permission is hereby granted, free of charge, to any person obtaining  
a copy of this software and associated documentation files (the  
"Software"), to deal in the Software without restriction, including  
without limitation the rights to use, copy, modify, merge, publish,  
distribute, sublicense, and/or sell copies of the Software, and to  
permit persons to whom the Software is furnished to do so, subject to  
the following conditions:  
  
The above copyright notice and this permission notice shall be  
included in all copies or substantial portions of the Software.  
  
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,  
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF  
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND  
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE  
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION  
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  
Comments
  • Disable click on internal textview

    Disable click on internal textview

    Is it possible to disable the click event on the Internal textview?, I'm using this view on a list and the users can't click on the area where the markdown text is added. If possible the consumer should be able to control events with the clickable modifier or having a click block that receives the text on the clicked area.

    bug status: fixed 
    opened by ale-groundcloud 8
  • java.lang.IllegalStateException: Unsupported

    java.lang.IllegalStateException: Unsupported

    java.lang.IllegalStateException: Unsupported
        at coil.util.-Utils.unsupported(Utils.kt:208)
        at coil.ImageLoader$Builder.availableMemoryPercentage(ImageLoader.kt:538)
        at dev.jeziellago.compose.markdowntext.MarkdownTextKt.createMarkdownRender(MarkdownText.kt:124)
        at dev.jeziellago.compose.markdowntext.MarkdownTextKt.MarkdownText-2NoNlqI(MarkdownText.kt:50)
        at space.technet.store.ui.activity.AppDetailActivity$onCreate$1$1$1.invoke(AppDetailActivity.kt:37)
        at space.technet.store.ui.activity.AppDetailActivity$onCreate$1$1$1.invoke(AppDetailActivity.kt:34)
    
    status: check 
    opened by JackuXL 4
  • Cannot scroll MarkdownText inside a LazyColumn

    Cannot scroll MarkdownText inside a LazyColumn

    I tried to use MarkdownText inside a LazyColumn but it isn't able to be scrolled.

                    Box(modifier = Modifier.fillMaxSize()) {
                        LazyColumn(
                            state = rememberLazyListState(),
                            modifier = Modifier.fillMaxSize()
                        ) {
                            item {
                                MarkdownText(
                                    markdown = demo,
                                    viewId = R.id.markdownTextId,
                                    modifier = Modifier
                                        .fillMaxWidth()
                                        .wrapContentHeight()
                                )
                            }
                        }
                    }
    

    I also tried using Column and verticalScroll modifier but it doesn't work.

                        Column(
                            modifier = Modifier
                                .fillMaxSize()
                                .verticalScroll(rememberScrollState())
                        ) {
                            MarkdownText(
                                markdown = demo,
                                viewId = R.id.markdownTextId,
                                modifier = Modifier
                                    .fillMaxWidth()
                                    .wrapContentHeight()
                            )
                        }
    

    Do you have any solution for this problem. Thank you.

    Note: If I can find a good solution, I'll push my PR to this repository. 😄

    opened by phucynwa 3
  • Invalid compose usage

    Invalid compose usage

    Actual version is creating new textview every state change, if I'm not mistaken. the code should be using something like this

    val markwon = ...
    val text = ...
    
    AndroidView(modifier = modifier,
          factory = { context -> TextView(context)},
          update = { textView -> markwon.setMarkdown(textView, text) }
      )
    
    status: fixed 
    opened by jbruchanov 3
  • MarkdownText not working on beta07

    MarkdownText not working on beta07

    Library is not working on compose beta07 using Android Studio Arctic Fox | 2020.3.1 Beta 2.

    Here's the stack trace:

    2021-05-22 21:08:19.732 10757-10757/br.com.nglauber.jetpackcomposeplayground E/AndroidRuntime: FATAL EXCEPTION: main
        Process: br.com.nglauber.jetpackcomposeplayground, PID: 10757
        java.lang.NoSuchMethodError: No interface method startRestartGroup(ILjava/lang/String;)Landroidx/compose/runtime/Composer; in class Landroidx/compose/runtime/Composer; or its super classes (declaration of 'androidx.compose.runtime.Composer' appears in /data/app/br.com.nglauber.jetpackcomposeplayground-pz_qCwlFrnIUpw_qmcHJAQ==/base.apk)
            at dev.jeziellago.compose.markdowntext.MarkdownTextKt.MarkdownText-PL9yxUQ(MarkdownText.kt:43)
            at br.com.nglauber.jetpackcomposeplayground.screens.Form2ScreenKt.Form2Screen(Form2Screen.kt:61)
            at br.com.nglauber.jetpackcomposeplayground.ComposableSingletons$MainActivityKt$lambda-8$1.invoke(MainActivity.kt:44)
            at br.com.nglauber.jetpackcomposeplayground.ComposableSingletons$MainActivityKt$lambda-8$1.invoke(MainActivity.kt:44)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
            at androidx.navigation.compose.NavHostKt$NavHost$6$1$1.invoke(NavHost.kt:134)
            at androidx.navigation.compose.NavHostKt$NavHost$6$1$1.invoke(NavHost.kt:133)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
            at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:193)
            at androidx.compose.runtime.saveable.SaveableStateHolderImpl.SaveableStateProvider(SaveableStateHolder.kt:84)
            at androidx.navigation.compose.NavBackStackEntryProviderKt.SaveableStateProvider(NavBackStackEntryProvider.kt:59)
            at androidx.navigation.compose.NavBackStackEntryProviderKt.access$SaveableStateProvider(NavBackStackEntryProvider.kt:1)
            at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:51)
            at androidx.navigation.compose.NavBackStackEntryProviderKt$LocalOwnersProvider$1.invoke(NavBackStackEntryProvider.kt:50)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
            at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:193)
            at androidx.navigation.compose.NavBackStackEntryProviderKt.LocalOwnersProvider(NavBackStackEntryProvider.kt:46)
            at androidx.navigation.compose.NavHostKt.NavHost(NavHost.kt:133)
            at androidx.navigation.compose.NavHostKt$NavHost$7.invoke(Unknown Source:13)
            at androidx.navigation.compose.NavHostKt$NavHost$7.invoke(Unknown Source:10)
            at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:96)
            at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2139)
            at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2402)
            at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:2554)
            at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:2525)
            at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:555)
            at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:733)
            at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:102)
            at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:443)
            at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:415)
            at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:34)
            at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
            at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
            at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
    2021-05-22 21:08:19.732 10757-10757/br.com.nglauber.jetpackcomposeplayground E/AndroidRuntime:     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:964)
            at android.view.Choreographer.doCallbacks(Choreographer.java:790)
            at android.view.Choreographer.doFrame(Choreographer.java:721)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:951)
            at android.os.Handler.handleCallback(Handler.java:883)
            at android.os.Handler.dispatchMessage(Handler.java:100)
            at android.os.Looper.loop(Looper.java:214)
            at android.app.ActivityThread.main(ActivityThread.java:7356)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
    

    This stackoverflow question might help ;) https://stackoverflow.com/questions/67611497/java-lang-nosuchmethoderror-after-upgrading-jetpack-compose-to-1-0-0-beta07/67651785#67651785

    bug 
    opened by nglauber 3
  • Update to support Coil 2.x

    Update to support Coil 2.x

    Attempting to use the library on a Coil 2.x project results in

     java.lang.IllegalStateException: Unsupported
            at coil.util.-Utils.unsupported(Utils.kt:227)
            at coil.ImageLoader$Builder.availableMemoryPercentage(ImageLoader.kt:538)
            at dev.jeziellago.compose.markdowntext.MarkdownTextKt.createMarkdownRender(MarkdownText.kt:124)
            at dev.jeziellago.compose.markdowntext.MarkdownTextKt.MarkdownText-2NoNlqI(MarkdownText.kt:50)
    
    opened by CarlosEsco 2
  • How to change line height?

    How to change line height?

    I've tried overriding the style, and that doesn't seem to work. Any idea how to set the line height?

    It seems to be ignoring many params from style = TextStyle(...

    opened by dessalines 2
  • Unable to Import Composable

    Unable to Import Composable

    Hi, trying to import your composable into the latest version of Android Studio and the gradle build fails to find the repo.

    https://jcenter.bintray.com/com/github/jeziellago/compose-markdown/0.2.6/compose-markdown-0.2.6.pom

    This gives a 403 forbidden.

    repositories { google() mavenCentral() maven { url 'https://jitpack.io' } }

    dependencies {
    implementation 'com.github.jeziellago:compose-markdown:0.2.6'
    }

    question 
    opened by MrFlibbleUK 2
  • Update compose and kotlin libraries

    Update compose and kotlin libraries

    I'm hoping that by updating some of the compose and kotlin libraries that it will fix the issue with supporting Coil 2.x

    https://github.com/jeziellago/compose-markdown/issues/22 & https://github.com/jeziellago/compose-markdown/issues/21

    opened by ohwittmannone 1
  • Sample App doesn't run and library doesn't seem to work

    Sample App doesn't run and library doesn't seem to work

    Trying to run the sample app results in

    Process: dev.jeziellago.compose.markdown, PID: 7234
        java.lang.AbstractMethodError: abstract method "void androidx.lifecycle.DefaultLifecycleObserver.onCreate(androidx.lifecycle.LifecycleOwner)"
            at androidx.lifecycle.FullLifecycleObserverAdapter.onStateChanged(FullLifecycleObserverAdapter.java:36)
            at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
            at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.java:196)
            at androidx.compose.ui.platform.AndroidComposeView.onAttachedToWindow(AndroidComposeView.android.kt:808)
            at android.view.View.dispatchAttachedToWindow(View.java:22010)
    

    Copying the example in the readme to a separate app results in no markdown actually being processed

    status: fixed 
    opened by CarlosEsco 1
  • Compose markdown with compose beta09

    Compose markdown with compose beta09

    Hello,

    Running the library with compose beta09 I get the following exception:

    java.lang.NoSuchMethodError: No static method MarkdownText-eOtqqlQ(Ljava/lang/String;Landroidx/compose/ui/Modifier;JJLandroidx/compose/ui/text/style/TextAlign;ILjava/lang/Integer;Landroidx/compose/ui/text/TextStyle;Ljava/lang/Integer;Landroidx/compose/runtime/Composer;II)V in class Ldev/jeziellago/compose/markdowntext/MarkdownTextKt; or its super classes (declaration of 'dev.jeziellago.compose.markdowntext.MarkdownTextKt' appears in /data/app/~~SoanHzL-pOMen0_nur2dow==/com.steleot.jetpackcompose.playground-jtFyw48jPh71oDCViD88aA==/base.apk!classes16.dex)
            at com.steleot.jetpackcompose.playground.compose.externallibraries.ComposeMarkdownScreenKt.ComposeMarkdownExample(ComposeMarkdownScreen.kt:46)
            at com.steleot.jetpackcompose.playground.compose.externallibraries.ComposeMarkdownScreenKt.access$ComposeMarkdownExample(ComposeMarkdownScreen.kt:1)
            at com.steleot.jetpackcompose.playground.compose.externallibraries.ComposableSingletons$ComposeMarkdownScreenKt$lambda-1$1.invoke(ComposeMarkdownScreen.kt:32)
            at com.steleot.jetpackcompose.playground.compose.externallibraries.ComposableSingletons$ComposeMarkdownScreenKt$lambda-1$1.invoke(ComposeMarkdownScreen.kt:26)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:116)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
            at androidx.compose.material.ScaffoldKt$ScaffoldLayout$1$1$1$bodyContentPlaceables$1.invoke(Scaffold.kt:316)
            at androidx.compose.material.ScaffoldKt$ScaffoldLayout$1$1$1$bodyContentPlaceables$1.invoke(Scaffold.kt:314)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
            at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2$1$1.invoke(SubcomposeLayout.kt:240)
            at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2$1$1.invoke(SubcomposeLayout.kt:240)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
            at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
            at androidx.compose.runtime.ComposerKt.invokeComposable(Composer.kt:3324)
            at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2575)
            at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:2571)
            at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(SnapshotState.kt:523)
            at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:2564)
            at androidx.compose.runtime.ComposerImpl.composeContent$runtime_release(Composer.kt:2515)
            at androidx.compose.runtime.CompositionImpl.composeContent(Composition.kt:476)
            at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:727)
            at androidx.compose.runtime.ComposerImpl$CompositionContextImpl.composeInitial$runtime_release(Composer.kt:2978)
            at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:432)
            at androidx.compose.ui.layout.SubcomposeLayoutState.subcomposeInto(SubcomposeLayout.kt:258)
            at androidx.compose.ui.layout.SubcomposeLayoutState.access$subcomposeInto(SubcomposeLayout.kt:145)
            at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2.invoke(SubcomposeLayout.kt:233)
            at androidx.compose.ui.layout.SubcomposeLayoutState$subcompose$2.invoke(SubcomposeLayout.kt:230)
            at androidx.compose.runtime.snapshots.SnapshotStateObserver.withNoObservations(SnapshotStateObserver.kt:140)
            at androidx.compose.ui.node.OwnerSnapshotObserver.withNoSnapshotReadObservation$ui_release(OwnerSnapshotObserver.kt:49)
            at androidx.compose.ui.node.LayoutNode.withNoSnapshotReadObservation$ui_release(LayoutNode.kt:1084)
            at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose(SubcomposeLayout.kt:230)
            at androidx.compose.ui.layout.SubcomposeLayoutState.subcompose(SubcomposeLayout.kt:225)
    
    status: fixed 
    opened by Vivecstel 1
  • Enable to handle individual clicks on Textview links.

    Enable to handle individual clicks on Textview links.

    This enhancement will let users handle the click listener on a link and decide what they want to do with the link instead of opening a browser by default.

    opened by yash786agg 0
  • `fontSize` has no impact to the real font size

    `fontSize` has no impact to the real font size

    How to reproduce:

    val (fontSize, setFontSize) = remember { mutableStateOf(14) }
    
    Button(onClick = { setFontSize(fontSize + 1) }) {
        Text("Increase font size")
    }
    MarkdownText(
        markdown = content,
        textAlign = TextAlign.Justify,
        // no further updates!
        fontSize = fontSize.sp,
        disableLinkMovementMethod = true,
    )
    

    The root of this problem is that in the library's code we have this:

        AndroidView(
            modifier = modifier,
            factory = { ctx ->
                createTextView(
                    context = ctx,
                    color = color,
                    defaultColor = defaultColor,
                    fontSize = fontSize,
                    fontResource = fontResource,
                    maxLines = maxLines,
                    style = style,
                    textAlign = textAlign,
                    viewId = viewId,
                    onClick = onClick,
                )
            },
            update = { textView ->
                markdownRender.setMarkdown(textView, markdown)
                if (disableLinkMovementMethod) {
                    textView.movementMethod = null
                }
            }
        )
    

    As you can see here, this composable function respects 2 parameters: the markdown content Itself and disableLinkMovementMethod. I am not sure this is wrong, this could be made for optimization purposes, but here is an ugly workaround:

    val (fontSize, setFontSize) = remember { mutableStateOf(14) }
    
    Button(onClick = { setFontSize(fontSize + 1) }) {
        Text("Increase font size")
    }
    key(content) {
      MarkdownText(
          markdown = content,
          textAlign = TextAlign.Justify,
          // no further updates!
          fontSize = fontSize.sp,
          disableLinkMovementMethod = true,
      )
    }
    

    This IS working but leads to recompose the whole Markdown (can be really slow if your text is huge).

    opened by pokatomnik 0
  • fontSize does not affect list point bullets

    fontSize does not affect list point bullets

    For the following string resource:

    <string name="test">
        - small text\n
        - small text\n
        - small text
    </string>
    

    And the following code:

    MarkdownText(
        markdown = stringResource(R.string.test),
        fontSize = 14.sp
    )
    

    The list's point bullets look larger than intended: image

    It seems that fontSize property does not affect their size.

    opened by BorisZubchenko 0
Releases(0.3.1)
Owner
Jeziel Lago
Jeziel Lago
A editable text with a constant text/placeholder for Android.

ParkedTextView A EditText with a constant text in the end. How to use <com.goka.parkedtextview.ParkedTextView xmlns:app="http://schemas.android.co

goka 270 Nov 11, 2022
RTL marquee text view android right to left moving text - persian - farsi - arabic - urdo

RTL marquee text view android right to left moving text - persian - farsi - arabic - urdo

mehran elyasi 4 Feb 14, 2022
Date text field with on the fly validation built with Jetpack Compose.

Date text field with on the fly validation built with Jetpack Compose.

null 15 Nov 16, 2022
Jetpack Compose Rich Text Editor

An all-in-one Jetpack Compose component to handle text styling inside TextFields

Paweł Chochura 26 Dec 14, 2022
An all-in-one Jetpack Compose component to handle text styling inside TextFields

An all-in-one Jetpack Compose component to handle text styling inside TextFields

Paweł Chochura 26 Dec 14, 2022
RichEditor for Android is a beautiful Rich Text WYSIWYG Editor for Android.

RichEditor for Android is a beautiful Rich Text WYSIWYG Editor for Android. Looking for iOS? Check out cjwirth/RichEditorView Supported Functions Bold

Daichi Furiya 6k Jan 2, 2023
:page_facing_up: Android Text Full Jusiftication / Wrapping / Justify / Hyphenate - V2.0

LIBRARY IS NO LONGER MAINTAINED If you want to adopt + maintain this library, please drop me a message - [email protected] Android Full Justific

Mathew Kurian 1.9k Dec 29, 2022
Android form edit text is an extension of EditText that brings data validation facilities to the edittext.

Android Form EditText Android form edit text is an extension of EditText that brings data validation facilities to the edittext. Example App I built a

Andrea 1.5k Dec 14, 2022
[DISCONTINUED] Rrich text editor for android platform. 安卓富文本编辑器,暂停维护

icarus-android Maybe the best rich text editor on android platform. Base on Simditor Features Alignment (left/center/right) Bold Blockquote Code Horiz

Dyson Woo 739 Sep 5, 2022
Android library contain custom realisation of EditText component for masking and formatting input text

Masked-Edittext Masked-Edittext android library EditText widget wrapper add masking and formatting input text functionality. Install Maven <dependency

Evgeny Safronov 600 Nov 29, 2022
An address-autocompleting text field for Android

android-PlacesAutocompleteTextView An AutocompleteTextView that interacts with the Google Maps Places API to provide location results and caches selec

SeatGeek 283 Dec 28, 2022
Chips EditText, Token EditText, Bubble EditText, Spannable EditText and etc.. There are many names of this control. Here I develop easy to understand , modify and integrate Chips Edit Text widget for Android

Chips EditText Library Chips EditText, Token EditText, Bubble EditText, Spannable EditText and etc.. There are many names of this control. Here I deve

kpbird 381 Nov 20, 2022
AutosizeEditText for Android is an extension of native EditText that offer a smooth auto scale text size.

AutoscaleEditText AutosizeEditText for Android is an extension of native EditText that offer a smooth auto scale text size. Latest Version How to use

Txus Ballesteros 354 Nov 28, 2022
Add text masking functionality to Android EditText. It will prevent user from inserting not allowed signs, and format input as well.

MaskFormatter MaskFormatter adds mask functionality to your EditText. It will prevent user from inserting not allowed signs, and format input as well.

Azimo Labs 161 Nov 25, 2022
Simple way to create linked text, such as @username or #hashtag, in Android TextView and EditText

Simple Linkable Text Simple way to create link text, such as @username or #hashtag, in Android TextView and EditText Installation Gradle Add dependenc

Aditya Pradana Sugiarto 76 Nov 29, 2022
Dealing with Android Text by simple way to get high performance.

Gapo Android RichText RichText supports Hashtag, Mention, Url, Phone Number, Email, Markdown, Custom Span, SeeMore/SeeLess by limited line or length,

GapoWork 8 Oct 20, 2021
Android Custom View for prevent the view behind on-screen keyboard when edit text is focused

Group Focusable Prevent the view behind on-screen keyboard when edit text is focused in Android UI Download Gradle implementation 'com.akexorcist:grou

Akexorcist 8 Jun 22, 2022
Dealing with Android Text by simple way to get high performance.

Gapo Android RichText RichText supports Hashtag, Mention, Url, Phone Number, Email, Markdown, Custom Span, SeeMore/SeeLess by limited line or length,

GapoWork 8 Oct 20, 2021
A simple Android library to protect part of text using Span

Text Protector A simple Android library to "protect" part of text using Span What is this? This is a small library for replacing part of a text in a T

Oleg Nestyuk 4 May 16, 2022