我正在开发简单的WYSIWYG编辑器,并且在更改背景时面临错误的布局调整
所以我有一个带有虚线背景的布局,以突出显示所选元素和内部视图。当用户点击布局时,逻辑是改变背景。
示例:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
>
<LinearLayout
android:id="@+id/layout_id_title_preview"
style="@style/SelectedDashedLayoutWrapWidth">
<TextView
android:id="@+id/text_logo_title"
android:text="@string/default_title"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
样式是:
<style name="SelectedDashedLayout">
<item name="android:background">@drawable/highlighter_stroke_transpwhite</item>
<item name="android:orientation">vertical</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:minWidth">@dimen/preview_highlighted_item_minwidth</item>
<item name="android:minHeight">@dimen/preview_highlighted_item_minheight</item>
<item name="android:paddingLeft">@dimen/preview_highlighted_item_padding_leftright</item>
<item name="android:paddingRight">@dimen/preview_highlighted_item_padding_leftright</item>
<item name="android:paddingTop">@dimen/preview_highlighted_item_padding_topbottom</item>
<item name="android:paddingBottom">@dimen/preview_highlighted_item_padding_topbottom</item>
</style>
<style name="SelectedDashedLayoutWrapWidth" parent="@style/SelectedDashedLayout">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
<style name="SelectedDashedLayoutMatchWidth" parent="@style/SelectedDashedLayout">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
</style>
我发现的可怕的事情是,如果你将View.OnClickListener添加到仪表板布局 - 它可能会强制重绘这个布局和他的邻居(!!!)。在此重绘期间,虚线大小的布局有时会破坏并返回到这些布局的最小尺寸(请参见屏幕截图)。 有趣的是,它会破坏背景高度,但不会破坏宽度。并非总是如此。
所以这是如何:
在onClick事件之后:
我还尝试将形状可绘制替换为颜色 - 具有相同的结果
更新
这是OnClick的完成方式:
View highlightedParentTitle = mPreviewLayout.findViewById(R.id.layout_id_title_preview);
highlightedParentTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// doesn't matter what is here, it could be even empty
}
});
但最令人惊讶的是,OnClick甚至可能是空的 - 它仍然会强制错误地重绘元素。