2013-03-13 26 views
13

Trong ứng dụng của tôi, tôi thay đổi tiêu đề trong ActionBar từ mỗi đoạn được hiển thị. Khi tôi lần đầu tiên khởi động ứng dụng của mình, tôi nhận được một danh sách các yêu cầu, vì vậy tiêu đề của tôi là "Yêu cầu của tôi (20)".Tại sao Android lại cắt xén tiêu đề ActionBar của tôi?

Sau đó, khi bạn nhấp vào một mục trong danh sách đó, nó sẽ thay thế một đoạn trong Hoạt động của tôi và đặt tiêu đề thành "Hành động".

Khi tôi quay lại chế độ xem đầu tiên (luôn trong cùng một Hoạt động), tôi đặt lại tựa đề thành "Yêu cầu của tôi (20)", nhưng Android quyết định cắt bớt nó. Vì vậy, kết quả là "Yêu cầu của tôi ...".

Sau nhiều lần kiểm tra, có vẻ như Android đang thu hẹp tiêu đề của tôi khi tôi đặt một văn bản nhỏ hơn trong đó. Nhưng nó không phóng to khi tôi đặt văn bản dài hơn, ngay cả khi có nhiều chỗ.

Tôi có thể làm gì để giải quyết vấn đề này? Tôi muốn một giải pháp tốt hơn vì thêm không gian ở phần cuối của tiêu đề ngắn của tôi :)

Đây là mã tôi sử dụng để thay đổi tiêu đề của ActionBar:

getActivity().getActionBar().setTitle(title); 

Trả lời

2

Tôi đã giải quyết vấn đề này bằng cách sử dụng tiêu đề tùy chỉnh như được mô tả in this post.

Đây là mã tôi sử dụng để thay đổi tiêu đề khi một tab thay đổi

((TextView) actionBar.getCustomView().findViewById(R.id.title)).setText(someTitle); 

Lưu ý rằng giải pháp này đặt tiêu đề ở bên phải của tab trong chế độ phong cảnh khi sử dụng actionbar tab.

+0

Cảm ơn bạn! Giải pháp này đơn giản và sạch sẽ, tôi thích nó! – NLemay

1

Tôi không nghĩ rằng có được nhiều bạn có thể làm được điều này. Dường như tiêu đề thanh hành động có chiều rộng khá hạn chế và bất kỳ thứ gì bị cắt ngắn.

Tôi đoán một vòng sẽ hiển thị: "reqs (20)" của tôi thay vì "Yêu cầu của tôi (20)" nhưng tôi đánh giá cao điều đó không lý tưởng.

+1

Xin chào! Cảm ơn bạn đã trả lời! Nó được nhiều đánh giá cao! Chỉ là một câu hỏi: đó là điều bạn đã gặp phải chưa? Đây có phải là hành vi bình thường đối với ActionBar không? Hay tôi đang làm gì sai? – NLemay

+1

Xin chào! Đây là điều tôi đã gặp phải. Tôi là một QA cho một tờ báo toàn cầu lớn và Devs android của chúng tôi cũng cho biết đây là bình thường ... Vì vậy, sợ nó trông giống như không có cách nào vòng nó ... Ngoại trừ đề nghị của tôi hoặc có thể sử dụng một hình ảnh. Mặc dù đưa ra yêu cầu của bạn bao gồm các số nguyên tăng có thể sẽ không đủ. –

+1

Vâng, đây cũng là kết luận của tôi sau vài giờ về vấn đề này. Điều này là lạ, bởi vì đôi khi tiêu đề bị cắt ngắn, đôi khi nó không phải. Nhưng tôi đã không tìm thấy một cách dễ dàng để giải quyết điều này ... – NLemay

5

Tôi biết câu hỏi này đã được đăng một thời gian dài trước đây, nhưng gần đây tôi đã gặp phải vấn đề này và nó gây ra một cơn đau đầu. Tôi đang làm việc trên Galaxy Note 10.1 và tiêu đề của tôi là "BidItems" và tôi chỉ có mục tràn hành động có thể nhìn thấy, nhưng đôi khi, "BidItems" đã trở thành "BidIt ..." mà chỉ là vô lý. Sau khi thử nghiệm nhiều, tôi thấy rằng lý do cho hành vi cắt xén này trong ứng dụng của tôi là tôi đã gọi một phương thức bằng cách sử dụng phương thức ((MyActivity) getApplication()).setTitle(); từ một trong các đoạn của tôi. Phương thức setTitle() trong Hoạt động của tôi gọi getActionBar().setTitle(). Ngay sau khi tôi gọi phương pháp này, tiêu đề của tôi đã bị cắt ngắn không có lý do. Nhưng chỉ cần gọi setTitle() từ hoạt động của tôi đã hoạt động tốt.

Tôi thực sự hy vọng điều này sẽ giúp mọi người đau đầu gây ra cho tôi.

+0

Cảm ơn! Nó trông giống như một sửa chữa tốt! – NLemay

+0

hi, bạn có thể giải thích rõ ràng hơn không? – Poutrathor

+0

Tôi cũng gặp vấn đề với setTitle(). Tôi cố gắng thay đổi tiêu đề từ giao diện thị thực phân đoạn thành Hoạt động. Nhưng không thể làm điều đó mà không có chiều dài văn bản thay đổi, và đây là bước ngoặt: chỉ gặp vấn đề này khi khởi động lần đầu tiên. Tôi chạy asynctask khi bắt đầu. Có lẽ đó là một cái gì đó vít lên. Không ý kiến. – Karl

1

Tôi sẽ thêm rằng bạn hoàn toàn có thể sử dụng các tiêu đề thanh tác vụ trên 2 dây chuyền để có thêm không gian:

//Set the title over 2 lines if needed: 
    int titleId = Resources.getSystem() 
      .getIdentifier("action_bar_title", "id", "android"); 
    if (titleId > 0) { 
     TextView title = (TextView) findViewById(titleId); 
     title.setSingleLine(false); 
     title.setMaxLines(2); 
     //   title.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); 
    } 

Tôi đang sử dụng nó trên ứng dụng của tôi và tôi hạnh phúc với nó :)

Ghi có vào số này post

1

AndroidManifest.xml của bạn có định nghĩa hoạt động của bạn như vậy

<activity 
     android:name="com.example.DetailsView" 
     android:label="Details"> 
</activity> 

Nếu bạn thay đổi android:label="Whatever" để android:label=" ",

Nó sẽ làm việc. Tôi cho rằng điều này xảy ra bởi vì android tạo ra một TextView để hiển thị nhãn và chiều rộng không được kích thước lại khi setTitle được gọi. Vì vậy, bằng cách đặt tiêu đề ban đầu để có nhiều ký tự hơn bạn sẽ đặt tiêu đề, nó sẽ không bị cắt bớt.

4

Tôi đoán vấn đề này được giải quyết bằng cách làm mới giao diện người dùng thanh tác vụ.

Vì vậy, tôi đã giải quyết bằng các mã bên dưới.

ActionBar actionBar = getActivity().getActionBar(); 
actionBar.setTitle(title); 

// for refreshing UI 
actionBar.setDisplayHomeAsUpEnabled(false); 
actionBar.setDisplayHomeAsUpEnabled(true); 
+1

Sau nhiều đau khổ, giải pháp của bạn là một khách hàng tiềm năng, nhưng không làm việc cho tôi vì tôi không muốn hiển thị (hoặc ẩn) nút Quay lại. Tôi tìm thấy một cách đơn giản hơn để làm mới giao diện người dùng: 'actionBar.setDisplayShowTitleEnabled (true);' Trong trường hợp đó, có nhiều cơ hội hơn chúng tôi luôn muốn hiển thị tiêu đề :-) –

2

Trong trường hợp của tôi các văn bản đã được cắt ngắn nhưng không phải với ellipsis (...), ký tự cuối cùng luôn cắt, như thế này:

screenshot

tôi phát hiện ra rằng việc thay đổi thanh công cụ chiều rộng từ "wrap_content", để "match_parent" giải quyết vấn đề này:

<android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:layout_weight="1" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 
2

đặt setTitle() trong onCreateOptionsMenu giúp tôi SOLV e vấn đề này.

Trong đoạn bạn thêm setHasOptionsMenu(true); trong onCreateView(){}

Sau đó ghi đè onCreateOptionsMenu().

Ví dụ:

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    // put getActivity in onCreateOptionsMenu will not return null 
    if (getActivity() != null) { 
     getActivity().setTitle(getResources().getString(R.string.Studies)); 
    } 
} 

tham khảo: How to display android actionbar title without truncation occurring

3

Trong trường hợp đặc biệt của tôi, tôi đang phát triển một ứng dụng lai với một cấu trúc menu có nguồn gốc phức tạp. Tôi sẽ thấy vấn đề này liên tục khi gọi một liên kết sâu từ nội dung hỗn hợp sẽ cập nhật tùy chọn menu đã chọn và đặt tiêu đề.

Tôi đã thử một số bản sửa lỗi được đề xuất không may mắn. Nhưng việc thiết lập chế độ xem tùy chỉnh tạo ra một kết quả lạ cho tôi cảm giác rằng tôi đang đối phó với một điều kiện chủng tộc.

Điều này đã chứng minh là đúng. Tôi thấy rằng chỉ đơn giản là trọng chức năng setTitle của hoạt động và gói các cuộc gọi đến siêu trong một postDelay Runnable cố định này cho tôi:

@Override 
public void setTitle(final CharSequence title) { 
    toolBar.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      MainActivity.super.setTitle(title); 
     } 
    }, 200); 
} 

Tôi đang sử dụng thanh công cụ của postDelayed như một phương pháp tiện lợi. Nhưng bạn chắc chắn có thể sử dụng một trình xử lý ở đây. Hi vọng điêu nay co ich.

1

Vì ListView/GridView/RecyclerView được gọi là notifyDataSetChanged() cùng một lúc. Đối với một số lý do, điều này sẽ gây ra cập nhật bố trí, mà tôi đoán kết quả trong sự hỗn loạn của bản cập nhật bố trí thanh tiêu đề của hành động.

Về cơ bản, bạn có thể postDelay() để cập nhật tiêu đề để khắc phục sự cố này, nhưng tôi không thích cách này.

Tôi quyết định ghi đè lên khung nhìn BaseAdapter.notifyDateSetChanged() và cập nhật mục bằng tay. Nó hoạt động:

public abstract class BaseListAdapter<BEAN extends Unique, VH extends BaseListViewHolder<BEAN>> extends BaseAdapter { 
    // data 
    private List<BEAN> mList; 
    // view holder 
    private List<VH> mViewHolderList = new ArrayList<>(); 

    protected abstract void onBindViewHolder(VH holder, int position); 

    protected abstract VH onCreateViewHolder(ViewGroup parent, int viewType); 

    ... 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     VH viewHolder; 
     if (convertView == null) { 
      viewHolder = onCreateViewHolder(parent, getItemViewType(position)); 
      convertView = viewHolder.itemView; 
      convertView.setTag(viewHolder); 
      mViewHolderList.add(viewHolder); 
     } else { 
      //noinspection unchecked 
      viewHolder = (VH) convertView.getTag(); 
     } 

     viewHolder.setData(getItem(position)); 
     viewHolder.setPosition(position); 
     onBindViewHolder(viewHolder, position); 

     return convertView; 
    } 

    @Override 
    public void notifyDataSetChanged() { 
     if (mViewHolderList.size() == 0) { 
      super.notifyDataSetChanged(); 
     } else { 
      for (VH vh : mViewHolderList) { 
       onBindViewHolder(vh, vh.getPosition()); 
      } 
     } 
    } 

} 

public class BaseListViewHolder<T> { 
    public View itemView; 
    private T data; 

    private int position; 

    public BaseListViewHolder(View itemView) { 
     this.itemView = itemView; 
    } 

    @Override 
    public T getData() { 
     return data; 
    } 

    @Override 
    public void setData(T data) { 
     this.data = data; 
    } 

    public int getPosition() { 
     return position; 
    } 

    public void setPosition(int position) { 
     this.position = position; 
    } 
} 

Xin lỗi vì tiếng anh xấu của tôi.

Các vấn đề liên quan