2015-07-20 17 views
8

tôi có các thiết lập sau:Thiết SupportActionBar subtitle multiline

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:subtitleTextAppearance="@style/TitleTextStyle" 
     app:theme="@style/ActionBarStyle.Light"/> 

<style name="TitleTextStyle"> 
    <item name="android:maxLines">2</item> 
    <item name="android:textAllCaps">false</item> 
</style> 

getSupportActionBar().setSubtitle(targetString); 

các @textAllCaps được áp dụng, nhưng @maxLines bị lờ đi (Tôi cũng đã cố gắng ' @minLines).

Làm cách nào để bật văn bản nhiều dòng phụ đề?

TIA

UPDATE:

tôi đã thêm mã vào onStart:

@Override 
public void onStart() { 
    super.onStart(); 
    try{ 
     Field field = Toolbar.class.getDeclaredField("mSubtitleTextView"); 
     field.setAccessible(true); 
     subtitleTextView = (TextView)field.get(toolbar); 
     subtitleTextView.setSingleLine(false); 
     subtitleTextView.setMaxLines(2); 
     subtitleTextView.setEllipsize(TruncateAt.END); 
    }catch(Exception e) { 
     Logg.e(this, "", e); 
    } 
} 

vấn đề bây giờ là, rằng các giá trị ellipsize được áp dụng, nhưng setMaxLines() gọi được bỏ qua ...

UPD2:

setSingleLine(false) đã thực hiện thủ thuật.

Trả lời

3

Thật không may, maxLines không phải là một phần của TextAppearance để thay đổi nó sẽ không ảnh hưởng đến giao diện phụ đề. Hơn nữa, không có cách nào pháp lý cách truy cập Toolbar.mSubtitleTextView, nhưng sau khi đặt văn bản phụ đề, bạn có thể truy cập nó qua phản ánh và thay đổi giao diện của nó theo ý muốn.

CẬP NHẬT:

Đó là cách bạn có thể truy cập mSubtitleTextView thông qua phản ánh.

public class SubtitleAccessor { 
    private static final Field sSubtitleTextViewField = getSubtitleTextViewField(); 

    private static Field getSubtitleTextViewField() { 
     try { 
      Field field = Toolbar.class.getDeclaredField("mSubtitleTextView"); 
      field.setAccessible(true); 
      return field; 
     } catch (NoSuchFieldException exception) { 
      return null; 
     } 
    } 

    public static TextView getSubtitleTextView(Toolbar toolbar) { 
     if (sSubtitleTextViewField == null) { 
      return null; 
     } 

     try { 
      return (TextView) sSubtitleTextViewField.get(toolbar); 
     } catch (IllegalAccessException exception) { 
      return null; 
     } 
    } 
} 
+0

thực sự tôi muốn đặt văn bản chỉ theo chương trình, do đó, phản chiếu hoặc giống nhau sẽ thực hiện – injecteer

+0

chính xác như thế nào tôi có thể truy cập vào 'textView' của phụ đề qua phản ánh? những gì sẽ là id của nó? – injecteer

+0

@injecteer Tôi đã thêm một mẫu mã vào câu trả lời. Bạn không thể tìm thấy 'mSubtitleTextView' theo id bởi vì nó được tạo ra trong thời gian chạy và không có và id. Vì vậy, điều tốt nhất bạn có thể làm bên cạnh việc xem xét lại giao diện người dùng của mình hoặc viết lớp 'Thanh công cụ 'của riêng bạn hoặc sử dụng chế độ xem tùy chỉnh thay cho tiêu đề và phụ đề đang truy cập trực tiếp vào các trường riêng tư của Thanh công cụ. – Michael

0

hãy cố gắng thêm:

<item name="android:singleLine">false</item> 

Nếu nó không hoạt động, bạn có thể thử sử dụng một giao diện tùy chỉnh:

ActionBar actionBar = getActionBar(); 
actionBar.setDisplayShowCustomEnabled(true); 
actionBar.setCustomView(R.layout.your_layout_file); 

đâu R.layout.your_layout_file là bố trí tùy chỉnh của bạn được thiết kế theo cách bạn muốn nó.

+0

gì về hỗ trợ-actionbar? – injecteer

+0

Nó giống nhau! – thiagolr

-1

Để sử dụng thanh công cụ và Appcompat 21, bạn phải sử dụng một ActionBarActivity và sử dụng:

((ActionBarActivity) getActivity()).getSupportActionBar().setSubtitle("About");