为什么Android是截断我的动作条的标题?(Why Android is truncating m

2019-08-17 14:00发布

在我的应用程序,我更改了动作条标题从显示的每个片段。 当我第一次开始我的应用程序,我要求的清单,所以我的题目是“我的请求(20)”。

然后,当你点击一个项目在该列表中,这是在我的活动更换片段并将其标题设置为“行动”。

当我回来的第一视图(总是在相同的活动),我的称号重置为“我的请求(20)”,但是Android决定截断它。 所以结果是“我的请求......”。

很多测试后,它看起来像Android是缩小我的标题,当我把一个小的文字吧。 不过,这并不放大,当我把一个较长的文字,即使有足够的空间。

我能做些什么来解决这个问题? 我想比我短标题的末尾添加空格更好的解决方案:)

下面是我用它来改变动作条的标题代码:

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

Answer 1:

我用解决所描述的自定义标题这个问题在这个岗位 。

这是代码,我用它来更改标题时,标签的变化

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

请注意,该解决方案使用动作条的标签时,标题的地方在横向模式选项卡的权利。



Answer 2:

我知道这个问题被张贴在很久以前,但我最近就遇到了这个问题,它造成头痛的地狱。 我工作的一个的Galaxy Note 10.1和我的标题是“标项”,而我只用了行动溢出项可见,但有时,“标项”变成了“BidIt ......”这仅仅是荒谬的。 多的测试后,我发现,在我的应用中,这截断行为的原因是,我用调用一个方法((MyActivity) getApplication()).setTitle(); 从我的片段中的一个方法。 该setTitle()在我的活动方法调用getActionBar().setTitle() 当我把这种方法,我的标题被截断没有任何理由。 但是,简单地调用setTitle()从我的活动效果很好。

我真的希望这样可以节省人们就引起了我的头痛。



Answer 3:

我想这个问题是令人耳目一新的操作栏UI解决。

所以,我曾与下面的代码解决。

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

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


Answer 4:

在我的具体情况,我正在开发一个复杂的本机菜单结构的混合应用。 从调用将更新所选的菜单选项和设置标题混合内容的深层链接时,我会间歇性地看这个问题。

我试了几个建议的修复与不是运气。 但是,设置自定义视图中产生一个奇怪的结果给了我处理的是一个竞争条件的感觉。

这证明是正确的。 我发现根本重写活动的功能的setTitle和包装调用超在postDelay运行的固定这对我来说:

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

我使用工具栏上的postDelayed作为一个方便的方法。 但你肯定可以在这里使用的处理程序。 希望这可以帮助。



Answer 5:

setTitle()onCreateOptionsMenu帮助我解决这个问题。

在您的片段添加setHasOptionsMenu(true);onCreateView(){}

然后重写onCreateOptionsMenu()

例:

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

参考: 如何在没有截断显示Android的动作条标题出现



Answer 6:

在我的情况下,文本是被截断,但不与省略号(...),最后一个字符总是切,就像这样:

我发现,从“WRAP_CONTENT”改变工具栏的宽度,以“match_parent”解决了这个问题:

    <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" />


Answer 7:

我不认为有什么可以做这件事。 好像是动作栏标题有一个相当有限的宽度,并在任何事情被截断。

我想一个捷径可走的。将显示:“我请求数(20)”,而不是“我的请求(20)”,但我明白,不理想。



Answer 8:

我补充一点,你完全可以使用2线操作栏标题,以获得更多的空间:

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

我使用它在我的申请,我很喜欢它:)

感谢这个岗位



Answer 9:

你会发现,我已经张贴在这里的问题是LIKEY问题,我也贴了解决方案。

为什么当explictily改变了我的Android动作条不更新



Answer 10:

您的AndroidManifest.xml有像这样的活动定义

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

如果更改android:label="Whatever"android:label=" "

它会工作。 我想这是因为Android的创建一个TextView显示标签和宽度不重新调整大小时,是的setTitle调用。 因此,通过设置初始标题有更多的字符比你要设定的冠军,也不会被截断。



Answer 11:

因为的ListView / GridView的/ RecyclerView是在同一时间称为notifyDataSetChanged()。 出于某种原因,这会导致布局更新,我猜结果在操作栏标题的布局更新的混乱。

基本上,你可以postDelay()来更新标题来解决这个问题,但我不喜欢这种方式。

我决定重写BaseAdapter.notifyDateSetChanged()和手工更新项目视图。 有用:

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

对不起,我的英语不好。



文章来源: Why Android is truncating my ActionBar title?