包含TextView
. 粗略地说,(下面的相关代码),我有一个自定义视图(的子类FrameLayout
),它膨胀了一些 xml 并将结果添加View
为一个孩子。膨胀的视图包含一个TextView
,以下称为“标签”。也可能相关(如果您不打算查看代码)是自定义视图作为子项添加到MapView
.
发生了以下非常奇怪的事情:
- 什么都不做:标签不可见,父母看起来很好。有趣的是,父视图显然考虑了标签的宽度(标签可见性设置
GONE
为父视图要窄得多)。在设计模式下,标签是可见的。 - 触摸父视图:标签短暂可见,然后消失。将您的手指放在它上面会保持标签可见,直到您结束触摸。
- 从父视图的构造函数调用
this.setPressed(true)
,this
当然是父视图:标签变为可见,并保持这种状态,直到父视图被触摸,之后行为恢复为“正常”。
这是相关的代码。作为上下文,当您触摸地图时,我们会将气球贴在地图上,其中应包含类似于“点击以选择此位置”的内容。气球中还有一些其他视图,但它们的可见性GONE
最初设置为,并且填充它们并显示它们的代码被禁用。不涉及地图叠加层,只需将视图直接附加到地图上MODE_MAP
即可将其粘贴到单个位置。
从自定义视图 BalloonView.java。此类中没有其他内容涉及布局/视图方法。
public BalloonView(Context context) {
super(context);
if(!isInEditMode()){ // RoboGuice doesn't like edit mode
RoboGuice.getInjector(context).injectMembersWithoutViews(this);
}
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// We're *not* attaching the view with it's default layout params.
View v = inflater.inflate(R.layout.balloon_view, this, false);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
params.gravity = Gravity.NO_GRAVITY;
addView(v,params);
label = (TextView) v.findViewById(R.id.label);
addressContainer = v.findViewById(R.id.addressContainer);
address1 = (TextView)findViewById(R.id.address1);
address2 = (TextView) findViewById(R.id.address2);
// makes label visible initially
// setPressed(true);
}
// This is the constructor that we actually call, in case it matters...
public BalloonView(Context context, OnClickListener onClick) {
this(context);
setOnClickListener(onClick);
}
气球视图.xml
<TextView
android:id="@+id/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="6dip"
android:layout_marginLeft="6dip"
android:layout_marginRight="6dip"
android:layout_marginTop="6dip"
android:text="@string/map_balloon_label"
android:enabled="true"
android:textAppearance="?android:attr/textAppearanceMedium" />
<LinearLayout
android:id="@+id/addressContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="6dip"
android:layout_marginLeft="8dip"
android:visibility="gone" >
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/place"
android:src="@drawable/location_place" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dip"
android:orientation="vertical" >
<TextView
android:id="@+id/address1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:visibility="visible" />
<TextView
android:id="@+id/address2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
这是我们附加BalloonView
到MapView
私有 MapView.LayoutParams 的地方 getBalloonViewLayoutParams(GeoPoint where){ return new MapView.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, where, MapView.LayoutParams.BOTTOM_CENTER); }
private void showBalloon(QPGeoPoint where) {
latitude = where.getLatitude();
longitude = where.getLongitude();
BalloonView bv = getBalloonView();
if(bv.getParent() != mapView){
Ln.d("bv.getParent()!=mapView");
mapView.addView(balloonView, getBalloonViewLayoutParams(where));
}else{
Ln.d("parent was map view");
balloonView.setLayoutParams(getBalloonViewLayoutParams(where));
}
balloonView.setVisibility(View.VISIBLE);
balloonView.setLocation(where);
}
其他(可能)相关的事情:
我们正在使用 ActionBarSherlock、RoboGuice 和 roboguice-sherlock 插件。
应用程序主题设置为 Sherlock。
Theme.Light.DarkActionBar
,但相关活动的主题设置为Theme.DeviceDefault.NoTitleBar
。
我完全感到困惑,数小时以来一直试图弄清楚这一点,并将继续这样做,并在我发现新线索时发布更新。