我可以在自定义InfoWindowAdapter中使用ViewPager吗?

时间:2015-12-10 14:57:11

标签: android android-viewpager android-adapter

我在Google Maps API2中使用InfoWindowAdapter。我的XML布局有一些简单的TextViewImageView视图,但我还需要一个ViewPager来允许用户刷一系列与地图上的标记关联的自定义布局(图像和一些文本) 。我的InfoWindow布局是:

spot_window_complex.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_relative_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/transparent"
android:orientation="vertical">

<LinearLayout
    android:id="@+id/lin1"
    android:layout_width="275.0dip"
    android:layout_height="140.0dip"
    android:orientation="vertical">

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="275.0dip"
        android:layout_height="85.0dip"
        android:background="@drawable/round" />

    <LinearLayout
        android:layout_width="275.0dip"
        android:layout_height="40.0dip"
        android:background="#ffeeeeee"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:paddingBottom="10.0dip"
        android:paddingTop="10.0dip">

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="10.0dip"
            android:paddingRight="3.0dip"
            android:src="@drawable/clock" />
        <ImageButton
            android:id="@+id/imgThumbsUp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#ffeeeeee"
            android:paddingRight="3.0dip"
            android:src="@drawable/thumbsup" />
        <TextView
            android:id="@+id/txtPve"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingRight="50.0dip"
            android:textColor="#ff29c200"
            android:textStyle="bold" />
        <ImageButton
            android:id="@+id/imgThumbsDown"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#ffeeeeee"
            android:paddingRight="3.0dip"
            android:src="@drawable/thumbsdown" />
        <TextView
            android:id="@+id/txtNve"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffc91c11"
            android:textStyle="bold" />
    </LinearLayout>
</LinearLayout>
</RelativeLayout>

我创建了一个简单的XML布局,试图让ViewPager在InfoWindowAdapter内工作:

viewpager_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:padding="10dp" >

<TextView
    android:id="@+id/countrylabel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Country: " />
<TextView
    android:id="@+id/country"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/countrylabel" />
</RelativeLayout>

我的ViewPagerAdapter似乎很标准:

class ViewPagerAdapter extends PagerAdapter {
    LayoutInflater inflater;
    String[] country = new String[]{"China", "India", "United States","Indonesia",
            "Brazil", "Pakistan", "Nigeria", "Bangladesh", "Russia", "Japan"};

    @Override
    public int getCount() {
        return country.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((RelativeLayout) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        inflater = (LayoutInflater) getActivity()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.viewpager_item, container,
                false);

        TextView txtcountry = (TextView) itemView.findViewById(R.id.country);
        txtcountry.setText(country[position]);
        ((ViewPager) container).addView(itemView);
        return itemView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // Remove viewpager_item.xml from ViewPager
        ((ViewPager) container).removeView((RelativeLayout) object);
    }
}

我的InfoWindowAdapter似乎也可以:

public class SimpleInfoWindowAdapter implements GoogleMap.InfoWindowAdapter {
    public SimpleInfoWindowAdapter() {
    }

    @Override
    public View getInfoWindow(Marker marker) {
        return null;
    }

    @Override
    public View getInfoContents(Marker marker) {
        View v;
        MySimpleMarker myMarker = mSimpleMarkersHashMap.get(marker);

        v = getActivity().getLayoutInflater().inflate(R.layout.spot_window_complex, null);
        TextView txtPve = (TextView) v.findViewById(R.id.txtPve);
        TextView txtNve = (TextView) v.findViewById(R.id.txtNve);
        txtPve.setText("0"); //test string only
        txtNve.setText("0"); //test string only

        ViewPager vPager = (ViewPager) v.findViewById(R.id.pager);
        vPager.setAdapter(new ViewPagerAdapter());

        return v;
    }
}

来自XML的静态视图或由适配器设置的TextViewImageView视图工作正常,一般布局也是如此。但是,我的ViewPager(在此测试用例中应该在TextViews中有10个可滑动的国家/地区)是空白的。所有相关代码都在一个片段内处理,Android监视器中没有错误。 Blank ViewPager above static content

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:2)

  

我还需要一个ViewPager来允许用户在地图上滑动与标记相关联的一系列自定义布局

这是不可能的。

  

任何想法我做错了什么?

您从View返回的InfoWindowAdapter会立即转换为BitmapBitmap即将在屏幕上显示的内容。因此,您不能拥有交互式小部件,例如ViewPager。它们不仅不是交互式的,而且在创建ViewPager之前,可能无法及时呈现异步呈现的任何内容(例如Bitmap中的页面)。

或者,引用the documentation

  

注意:绘制的信息窗口不是实时视图。视图在返回时呈现为图像(使用View.draw(Canvas))。这意味着对视图的任何后续更改都不会被地图上的信息窗口反映出来。要稍后更新信息窗口(例如,在加载图像后),请调用showInfoWindow()。此外,信息窗口将不会考虑正常视图(例如触摸或手势事件)的任何典型交互。但是,您可以在整个信息窗口中收听通用点击事件,如以下部分所述。