4

我已经尝试了几种不同的方法,其中包括发现here(这反过来又导致我试着对this问题的顶部答案),以及使用反射访问TextView并设置相关方法。这两种尝试都失败了,前者导致根本没有设置文本标题(我将文本设置为正确的textview元素),后者设置文本并删除椭圆,但根本没有进行过滤。以下是我的反思尝试。Android中使用Lollipop SDK的工具栏/ ActionBar中的字幕标题?

import android.content.Context; 
import android.support.v7.widget.Toolbar; 
import android.text.TextUtils; 
import android.util.AttributeSet; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.lang.reflect.Field; 

public class MarqueeToolbar extends Toolbar { 

    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); 
    } 

    @Override 
    public void setTitle(int resId) { 
     if (!reflected) { 
      reflected = reflectTitle(); 
     } 
     super.setTitle(resId); 
    } 

    boolean reflected = false; 
    private boolean reflectTitle() { 
     try { 
      Field field = Toolbar.class.getDeclaredField("mTitleTextView"); 
      field.setAccessible(true); 
      TextView titleView = (TextView) field.get(this); 
      titleView.setEllipsize(TextUtils.TruncateAt.MARQUEE); 
      titleView.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; 
     } 
    } 
} 

回答

6

尝试把一个TextView工具栏里面:

<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?attr/actionBarSize" > 

    <TextView 
     android:id="@+id/toolbar_title" 
     android:text="This will run the marquee animation forever" 
     android:textSize="@dimen/abc_text_size_title_material_toolbar" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:ellipsize="marquee" 
     android:marqueeRepeatLimit="marquee_forever" 
     android:scrollHorizontally="true" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:singleLine="true" /> 

</android.support.v7.widget.Toolbar> 

,然后使用工具栏作为动作条和透明/禁用其标题:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 
getSupportActionBar().setTitle(null); // or, setDisplayShowTitleEnabled(false) 
+0

漂亮的代码,但没有工作在(KitKat)以上。有什么我可以做的吗? – 2016-06-16 08:09:00

8

获得从TextView声明字段名称标题TextView对象Toolbar类和工具栏的Marquee字幕。

TextView titleTextView = null; 

    try { 
     Field f = toolbar.getClass().getDeclaredField("mTitleTextView"); 
     f.setAccessible(true); 
     titleTextView = (TextView) f.get(toolbar); 

     titleTextView.setEllipsize(TruncateAt.MARQUEE); 
     titleTextView.setFocusable(true); 
     titleTextView.setFocusableInTouchMode(true); 
     titleTextView.requestFocus(); 
     titleTextView.setSingleLine(true); 
     titleTextView.setSelected(true); 
     titleTextView.setMarqueeRepeatLimit(-1); 

    } catch (NoSuchFieldException e) { 
    } catch (IllegalAccessException e) { 
    } 
+0

得到此:试图调用虚拟方法'无效android.widget.TextView.setEllipsize(android.text.TextUtils $ TruncateAt)'对空引用 – Umer 2015-12-10 06:37:57

+0

适用于我在Android 7.0上。 – Makalele 2016-10-13 10:54:05

0

创建自定义工具栏和应用标题和副标题跑马灯效果:

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) { 

     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); 
} 

}