1

我会尽量清楚我正在尝试做的事情。我有 MapView,它首先在 Geopoint 的帮助下居中。然后,在这个 MapView 之上,我有一个 LinearLayout,它显示一些信息(linearlayout 部分覆盖了 mapview)。它的宽度根据其内容而变化。为了让我的 MapView 居中,我希望能够获取线性布局的宽度,然后动态滚动该宽度的地图视图(使用 ScrollBy 方法)(每次线性布局的内容发生变化时,都会滚动地图视图)。

这是我到目前为止所做的:

我的 main.xml 的摘录(它由我的 Activity 使用)包含 mapview 和自定义线性布局:

<com.mikecorp.weather.tab.myframe
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
>
<com.google.android.maps.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:apiKey="@string/mapKey"
android:clickable="true"/>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="right"
android:gravity="right"
android:orientation="horizontal">
<com.mikecorp.weather.tab.PanelLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/panel_weather_city"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="right"
android:gravity="right"
android:orientation="vertical"
android:background="#FF4B4B4B" >
<TextView
android:id="@+id/curr_weather_city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="5dip"
android:layout_marginRight="20dip"
android:paddingLeft="5dip"
android:gravity="center"
android:textSize="35dip"
android:textStyle="bold" >
</TextView>
<View android:id="@+id/divider_h"
android:background="@drawable/black_white_gradient"
android:layout_width="fill_parent"
android:layout_height="2dp"
/>
<TextView
android:id="@+id/curr_weather_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"           
android:textSize="20dip"
android:textStyle="bold"
android:paddingLeft="5dip"
android:paddingRight="20dip"
android:paddingTop="10dip" 
android:paddingBottom="20dip"
>               
</TextView>
<TextView
android:id="@+id/curr_weather"
android:layout_width="wrap_content"
android:layout_height="wrap_content"              
android:paddingLeft="5dip"
android:layout_marginRight="20dip" >
</TextView>     
</com.mikecorp.weather.tab.PanelLayout>
</LinearLayout>
</com.mikecorp.weather.tab.myframe>

如您所见,我有一个自定义的 LinearLayout (PanelLayout),在其中定义了 onLayout 和 onSizeChanged 方法,以便获得正确的布局宽度。这很好用。我可以看到正确的尺寸。

public class PanelLayout extends LinearLayout {

private MapView mview;
private MapController controller;


public PanelLayout(Context context) {
    super(context);

}

public PanelLayout(Context context, AttributeSet attrs){
    super(context, attrs);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    Log.d("TEST", "onLayout:" + String.format("%s-%d,%d,%d,%d", changed, l, t, r, b));
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    Log.d("TEST", "onSizeChanged:" + String.format("%d,%d,%d,%d", w, h, oldw, oldh));


    mview = (MapView) findViewById(R.id.mapView);

    controller = mview.getController();
    controller.scrollBy(w, 0);
}

}

但是,当我运行程序时,我有一个 NULL 指针异常(mview 为空)。

在此之前,我尝试在活动本身中获取线性布局的宽度(getWidth 方法),但由于尚未创建线性布局,因此它没有给出正确的值。这就是为什么我决定在自定义 LinearLayout 中使用 onSizeChanged 方法。但是,在这里,我被阻止了。

我还考虑过使用包含我的 LinearLayout 和 MapView 的 ViewGroup(及其 onLayout 方法),但是我不知道何时更改 LinearLayout 的宽度。

希望所有这些对你们都有意义,并且你们将有足够的信息来帮助我;)

4

0 回答 0