Add ability to specify MovementMethod when applying markdown to a TextView

This commit is contained in:
Dimitry Ivanov 2018-06-05 15:15:05 +02:00
parent 10b847a100
commit 27683ea11f
4 changed files with 32 additions and 4 deletions

View File

@ -31,6 +31,7 @@ dependencies {
implementation project(':library-image-loader') implementation project(':library-image-loader')
implementation 'ru.noties:debug:3.0.0@jar' implementation 'ru.noties:debug:3.0.0@jar'
implementation 'me.saket:better-link-movement-method:2.2.0'
implementation OK_HTTP implementation OK_HTTP

View File

@ -4,11 +4,14 @@ import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import javax.inject.Inject; import javax.inject.Inject;
import me.saket.bettermovementmethod.BetterLinkMovementMethod;
import ru.noties.debug.Debug; import ru.noties.debug.Debug;
public class MainActivity extends Activity { public class MainActivity extends Activity {
@ -64,7 +67,7 @@ public class MainActivity extends Activity {
markdownRenderer.render(MainActivity.this, uri(), text, new MarkdownRenderer.MarkdownReadyListener() { markdownRenderer.render(MainActivity.this, uri(), text, new MarkdownRenderer.MarkdownReadyListener() {
@Override @Override
public void onMarkdownReady(CharSequence markdown) { public void onMarkdownReady(CharSequence markdown) {
Markwon.setText(textView, markdown); Markwon.setText(textView, markdown, BetterLinkMovementMethod.getInstance());
Views.setVisible(progress, false); Views.setVisible(progress, false);
} }
}); });
@ -72,6 +75,7 @@ public class MainActivity extends Activity {
}); });
} }
@NonNull
private AppBarItem.State appBarState() { private AppBarItem.State appBarState() {
final String title; final String title;
@ -100,6 +104,7 @@ public class MainActivity extends Activity {
} }
} }
@Nullable
private Uri uri() { private Uri uri() {
final Intent intent = getIntent(); final Intent intent = getIntent();
return intent != null return intent != null

View File

@ -17,6 +17,7 @@
android:layout_margin="16dip" android:layout_margin="16dip"
android:lineSpacingExtra="2dip" android:lineSpacingExtra="2dip"
android:textSize="16sp" android:textSize="16sp"
android:textIsSelectable="true"
tools:context="ru.noties.markwon.MainActivity" tools:context="ru.noties.markwon.MainActivity"
tools:text="yo\nman" /> tools:text="yo\nman" />

View File

@ -2,7 +2,9 @@ package ru.noties.markwon;
import android.content.Context; import android.content.Context;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.method.LinkMovementMethod; import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.widget.TextView; import android.widget.TextView;
import org.commonmark.ext.gfm.strikethrough.StrikethroughExtension; import org.commonmark.ext.gfm.strikethrough.StrikethroughExtension;
@ -67,20 +69,39 @@ public abstract class Markwon {
/** /**
* Helper method to apply parsed markdown. * Helper method to apply parsed markdown.
* <p>
* Since 1.0.6 redirects it\'s call to {@link #setText(TextView, CharSequence, MovementMethod)}
* with LinkMovementMethod as an argument to preserve current API.
* *
* @param view {@link TextView} to set markdown into * @param view {@link TextView} to set markdown into
* @param text parsed markdown * @param text parsed markdown
* @see #scheduleDrawables(TextView) * @see #setText(TextView, CharSequence, MovementMethod)
* @see #scheduleTableRows(TextView)
* @since 1.0.0 * @since 1.0.0
*/ */
public static void setText(@NonNull TextView view, CharSequence text) { public static void setText(@NonNull TextView view, CharSequence text) {
setText(view, text, LinkMovementMethod.getInstance());
}
/**
* Helper method to apply parsed markdown with additional argument of a MovementMethod. Used
* to workaround problems that occur when using system LinkMovementMethod (for example:
* https://issuetracker.google.com/issues/37068143). As a better alternative to it consider
* using: https://github.com/saket/Better-Link-Movement-Method
*
* @param view TextView to set markdown into
* @param text parsed markdown
* @param movementMethod an implementation if MovementMethod or null
* @see #scheduleDrawables(TextView)
* @see #scheduleTableRows(TextView)
* @since 1.0.6
*/
public static void setText(@NonNull TextView view, CharSequence text, @Nullable MovementMethod movementMethod) {
unscheduleDrawables(view); unscheduleDrawables(view);
unscheduleTableRows(view); unscheduleTableRows(view);
// update movement method (for links to be clickable) // update movement method (for links to be clickable)
view.setMovementMethod(LinkMovementMethod.getInstance()); view.setMovementMethod(movementMethod);
view.setText(text); view.setText(text);
// schedule drawables (dynamic drawables that can change bounds/animate will be correctly updated) // schedule drawables (dynamic drawables that can change bounds/animate will be correctly updated)