在父视图上触摸或调用setPressed()会更改TextView的可见性

时间:2012-10-16 01:22:09

标签: android android-layout

使用包含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);
}

balloon_view.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的位置     private MapView.LayoutParams getBalloonViewLayoutParams(GeoPoint where){         返回新的MapView.LayoutParams(                 ViewGroup.LayoutParams.WRAP_CONTENT,                 ViewGroup.LayoutParams.WRAP_CONTENT,                 其中,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

我完全感到困惑,一直试图弄清楚这几个小时,并且会继续这样做并发布更新,因为我找到了新的线索。

1 个答案:

答案 0 :(得分:2)

女士们和女士们,这里是:

文字和背景都是白色。触摸文本会将其颜色状态设置为按下,这使其黑色

快速解决方法是更改​​文本视图中的textColor属性。

更一般的解决方法可能是为此活动使用不同的主题,例如Theme.DeviceDefault.Light.NoTitleBar

对此感到非常愚蠢; P