今天在做一个项目的时候用到了ViewSwitcher,然而却遇到了子布局无法居中的问题,以下是问题代码
historySwitcher = (ViewSwitcher) findViewById(R.id.history_container);
historySwitcher.setFactory(new ViewSwitcher.ViewFactory()
{
// 实际上就是返回一个view
@Override
public View makeView()
{
return LayoutInflater.from(mContext).inflate(R.layout.history_view,null);
}
});
按照网上的例子,直接以匿名内部类的方法新建了viewFactory
之后,对获取到的view进行加工
SpannableStringBuilder text= new SpannableStringBuilder(mContext.getResources().getString(R.string.history_empty));
text.setSpan(new AbsoluteSizeSpan(60), 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
viewToShow.findViewById(R.id.history_list).setVisibility(View.GONE);
TextView tv = viewToShow.findViewById(R.id.history_action_name);
tv.setText(text);
viewToShow.setForegroundGravity(Gravity.CENTER);
historySwitcher.showNext();
这时候遇到问题,上述代码的textview无论如何都无法居中
将布局染色后发现,R.layout.history_view这个布局没有填满预留出的位置,导致此问题
排查后发现,是由于ViewSwitcher返回的view没有绑定根所导致的,修改第一段代码如下
historySwitcher = (ViewSwitcher) findViewById(R.id.history_container);
historySwitcher.setFactory(new ViewSwitcher.ViewFactory()
{
// 实际上就是返回一个view
@Override
public View makeView()
{
return LayoutInflater.from(mContext).inflate(R.layout.history_view,(ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content),
false);
}
});
注意,为了使布局摆放更加合理,应主动绑定父布局