-
-
Save oleksandr-dovhaliuk-gp1/c94756c999e4df90a330 to your computer and use it in GitHub Desktop.
| import android.content.Context; | |
| import android.support.v7.widget.Toolbar; | |
| import android.text.TextUtils; | |
| import android.util.AttributeSet; | |
| import android.widget.TextView; | |
| import java.lang.reflect.Field; | |
| public class MarqueeToolbar extends Toolbar { | |
| TextView title, subTitle; | |
| public MarqueeToolbar(Context context) { | |
| super(context); | |
| } | |
| public MarqueeToolbar(Context context, AttributeSet attrs) { | |
| super(context, attrs); | |
| } | |
| public MarqueeToolbar(Context context, AttributeSet attrs, int defStyleAttr) { | |
| super(context, attrs, defStyleAttr); | |
| } | |
| @Override | |
| public void setTitle(CharSequence title) { | |
| if (!reflected) { | |
| reflected = reflectTitle(); | |
| } | |
| super.setTitle(title); | |
| selectTitle(); | |
| } | |
| @Override | |
| public void setTitle(int resId) { | |
| if (!reflected) { | |
| reflected = reflectTitle(); | |
| } | |
| super.setTitle(resId); | |
| selectTitle(); | |
| } | |
| boolean reflected = false; | |
| private boolean reflectTitle() { | |
| try { | |
| Field field = Toolbar.class.getDeclaredField("mTitleTextView"); | |
| field.setAccessible(true); | |
| title = (TextView) field.get(this); | |
| title.setEllipsize(TextUtils.TruncateAt.MARQUEE); | |
| title.setMarqueeRepeatLimit(-1); | |
| return true; | |
| } catch (NoSuchFieldException e) { | |
| e.printStackTrace(); | |
| return false; | |
| } catch (IllegalAccessException e) { | |
| e.printStackTrace(); | |
| return false; | |
| } catch (NullPointerException e) { | |
| e.printStackTrace(); | |
| return false; | |
| } | |
| } | |
| public void selectTitle() { | |
| if (title != null) | |
| title.setSelected(true); | |
| } | |
| // ------------ for Subtitle ---------- | |
| @Override | |
| public void setSubtitle(CharSequence subTitle) { | |
| if (!reflectedSub) { | |
| reflectedSub = reflectSubTitle(); | |
| } | |
| super.setSubtitle(subTitle); | |
| selectSubtitle(); | |
| } | |
| @Override | |
| public void setSubtitle(int resId) { | |
| if (!reflected) { | |
| reflectedSub = reflectSubTitle(); | |
| } | |
| super.setSubtitle(resId); | |
| selectSubtitle(); | |
| } | |
| boolean reflectedSub = false; | |
| private boolean reflectSubTitle() { | |
| try { | |
| Field field = Toolbar.class.getDeclaredField("mSubtitleTextView"); | |
| field.setAccessible(true); | |
| subTitle = (TextView) field.get(this); | |
| subTitle.setEllipsize(TextUtils.TruncateAt.MARQUEE); | |
| subTitle.setMarqueeRepeatLimit(-1); | |
| return true; | |
| } catch (NoSuchFieldException e) { | |
| e.printStackTrace(); | |
| return false; | |
| } catch (IllegalAccessException e) { | |
| e.printStackTrace(); | |
| return false; | |
| } catch (NullPointerException e) { | |
| e.printStackTrace(); | |
| return false; | |
| } | |
| } | |
| public void selectSubtitle() { | |
| if (subTitle != null) | |
| subTitle.setSelected(true); | |
| } | |
| } |
Hello sir
I am getting error
java.lang.NoSuchFieldException: No field mTitleTextView in class
I am using 'com.android.support:appcompat-v7:27.1.1'
Please help me
@karishmapujara @gwebalex I suppose it happens because reflection can't find "mTitleTextView" in "field.get(this)". The problem is with THIS.
I solved it by creating an extension function for a regular Toolbar so that "this" now refers to the right class.
fun Toolbar.marqueeTitle() {
try {
val title: TextView?
val field = Toolbar::class.java.getDeclaredField("mTitleTextView")
field.isAccessible = true
title = field.get(this) as? TextView
title?.ellipsize = TextUtils.TruncateAt.MARQUEE
title?.marqueeRepeatLimit = -1
title?.isSelected = true
} catch (e: NoSuchFieldException) {
e.printStackTrace()
} catch (e: IllegalAccessException) {
e.printStackTrace()
} catch (e: NullPointerException) {
e.printStackTrace()
}
}
btw, "catch" branch for NPE may be redundant in my case
fun Toolbar.marqueeTitle() { runCatching { val title: TextView? val field = Toolbar::class.java.getDeclaredField("mTitleTextView") field.isAccessible = true title = field.get(this) as? TextView title?.ellipsize = TextUtils.TruncateAt.MARQUEE title?.marqueeRepeatLimit = -1 title?.isSelected = true } }
@eolszewski what is wrong in line 84?