我实际上正在编写一个使用Google Maps API的Android应用。
布局activity_main.xml如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mapContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"
map:mapType="normal"
map:uiCompass="false"
map:uiRotateGestures="true"
map:uiScrollGestures="true"
map:uiTiltGestures="true"
map:uiZoomControls="false"
map:uiZoomGestures="true" />
</LinearLayout>
我在片段中异步加载地图。当我尝试给activity_main视图充气时:
LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup mainView = (ViewGroup) inflater.inflate(R.layout.activity_main, null);
应用程序崩溃并返回错误:
01-15 19:25:16.045: E/AndroidRuntime(21115): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.MainActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class fragment
我该如何解决?我需要这个ViewGroup为应用程序设置一个Power Button KeyListener(类似于我在另一个没有片段的app中所做的):
mainView.setOnKeyListener(new OnKeyListener()
{
@Override
public boolean onKey(View v, int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_POWER)
{
//STUFF
}
}
});
感谢您的帮助:D
答案 0 :(得分:0)
命名空间
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/mapContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"
map:mapType="normal"
map:uiCompass="false"
map:uiRotateGestures="true"
map:uiScrollGestures="true"
map:uiTiltGestures="true"
map:uiZoomControls="false"
map:uiZoomGestures="true" />
</LinearLayout>
答案 1 :(得分:0)
您是否在清单文件中添加了这些行:
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="YOUR_KEY" />
看看这个网站 https://docs.google.com/document/pub?id=19nQzvKP-CVLd7_VrpwnHfl-AE9fjbJySowONZZtNHzw
答案 2 :(得分:0)
我几乎解决了这个问题。我已经创建了一个自定义的SupportMapFragment类,并且我动态地在FrameLayout中加载片段。
activity_main.xml如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/mapContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<FrameLayout
android:id="@+id/mapPlaceholder"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
我现在可以通过代码扩充activity_main:
LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup mainView = (ViewGroup) inflater.inflate(R.layout.activity_main, null);
在此之后,我设置了监听器(100%工作):
mainView.setFocusableInTouchMode(true);
mainView.setOnKeyListener(new OnKeyListener()
{
@Override
public boolean onKey(View v, int keyCode, KeyEvent event)
{
//STUFF
}
});
我已经添加了这样的观点:
final WindowManager myWindowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
myWindowManager.addView(mainView, viewParams);
我没有在onCreate的任何地方使用setContentView,所以这是第二个问题。我需要通过FragmentTransaction在FrameLayout中加载GoogleMap。
FragmentTransaction需要setContentView才能工作。这段代码:
FrameLayout mapPlaceholder = (FrameLayout) mainView.findViewById(R.id.mapPlaceholder);
if(mapPlaceholder != null) {
mapFragment = GoogleMapFragment.newInstance();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(mapPlaceholder.getId(), mapFragment, GoogleMapFragment.class.getName());
ft.commit();
}
启动应用程序时返回此错误:
01-16 18:22:20.263: E/AndroidRuntime(7755): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.MainActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f070018 (com.example.app:id/mapPlaceholder) for fragment GoogleMapFragment{b666a7d #0 id=0x7f070018 com.example.app.GoogleMapFragment}
有没有人知道如何在没有setContentView的情况下使用FragmentTransaction(或添加片段)?