如何使用OnSizeChanged来调整MapView大小?

时间:2013-03-23 17:11:53

标签: android

我会尽量清楚我想做的事情。我有MapView,它首先在Geopoint的帮助下居中。 然后,在这个MapView的顶部,我有一个显示一些信息的LinearLayout(linearlayout部分覆盖了mapview)。它的宽度因其内容而异。为了保持我的MapView居中,我希望能够获得linearlayout的宽度,然后动态滚动该宽度的mapview(使用ScrollBy方法)(每次linearlayout的内容更改时,都会滚动mapview)。

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

我的main.xml的摘录(由我的Activity使用)包含mapview和自定义linearlayout:

<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为null)。

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

我还考虑过使用包含我的LinearLayout和MapView的ViewGroup(及其onLayout方法),但后来我不知道LinearLayout的宽度何时发生了变化。

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

0 个答案:

没有答案