9

アクション バー タブを実装するアプリを構築しようとしています。タブの 1 つに MapFragment が含まれている必要があります。

タブ付きのアクションバーを実装するにはどうすればよいですか?その下にマップフラグメントがありますか?

これを進める方法を教えていただけますか?

これが私がこれまでに持っているものです:

メインクラス

package com.nfc.demo;

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;

public class NFCDemoActivity extends Activity {

  Tab selectedTab = null;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActionBar bar = getActionBar();
    bar.setDisplayShowHomeEnabled(false);
    bar.setDisplayShowTitleEnabled(false);

    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    bar.setCustomView(R.layout.main);

    ActionBar.Tab mapTab = bar.newTab().setText("Map");
    ActionBar.Tab settingsTab = bar.newTab().setText("Settings");
    ActionBar.Tab aboutTab = bar.newTab().setText("About");

    MapFragment mapFragment = new MapFragment();
    SettingsFragment settingsFragment = new SettingsFragment();
    AboutFragment aboutFragment = new AboutFragment();

    mapTab.setTabListener(new TabListener(mapFragment));
    settingsTab.setTabListener(new TabListener(settingsFragment));
    aboutTab.setTabListener(new TabListener(aboutFragment));

    Tab selectedTab = (Tab) getLastNonConfigurationInstance();

    if (selectedTab == null) {
      bar.addTab(mapTab, false);
      bar.addTab(settingsTab, false);
      bar.addTab(aboutTab, true);
    }

    setContentView(R.layout.main);

  }

  public Object onRetainNonConfigurationInstance() {
    return selectedTab;
  }

  protected boolean isRouteDisplayed() {
      return false;
  }

  protected class TabListener implements ActionBar.TabListener {
    private Fragment fragment;

    public TabListener(Fragment fragment) {
        this.fragment = fragment;
    }

    public void onTabSelected(Tab tab, FragmentTransaction fragmentTransaction) {
        fragmentTransaction.replace(R.id.mainFragment, this.fragment, null);
        selectedTab = tab;
    }

    public void onTabUnselected(Tab tab, FragmentTransaction fragmentTransaction) {
        fragmentTransaction.remove(this.fragment);
    }

    public void onTabReselected(Tab tab, FragmentTransaction fragmentTransaction) {
        //do nothing
    }
  }
}

Fragment クラスはすべて、.xml レイアウトのインフレータを返すだけです。

XML レイアウト :

main.xml (マップはこの XML ファイルにある必要があります)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

</LinearLayout>

settings.xml および about.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/textView123"
        android:text="asdfg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

しかし、追加するMapFragmentとエラーが発生します:

Error inflating class fragment 
error caused by java.lang.IllegalArgumentException: 
Binary XML file line #2: Duplicate id 0x7f040005, tag null, or parent id 0x1020002 with another fragment for com.google.android.gms.maps.MapFragment 12-28 21:14:07.991: E/AndroidRuntime(26189): at android.app.Activity.onCreateView(Activity.java:4722)

数日間、どのように進めるかを考えていましたが、本当に混乱しています。ヘルプ/ヒントをいただければ幸いです。

また、どうgetLastNonConfigurationInstance()ですか?非推奨です。

4

2 に答える 2

17

次のソリューションでは、GoogleMap をアクション バーのタブ/ドロップダウンに追加できます。これを行うための鍵は、アクション バーで別のフラグメントに切り替えるときに MapFragment を破棄するようにフラグメントを正しく設定することにあります。

アクション バー機能を実装するアクティビティを作成します。

  1. メイン アクティビティにタブを使用するプロジェクトを Eclipse で作成します。これを行わない場合は、手順 2 ~ 5 に進みます。
  2. を拡張Activityして実装するクラスを作成しますActionBar.OnNavigationListener
  3. タブ フラグメントを切り替えるときにタブ フラグメントのコンテナとなるレイアウト XML ファイルを作成します。
  4. Activity クラスで次のメソッドを実装/オーバーライドしますpublic boolean onNavigationItemSelected(int position, long id)
  5. このメソッドでは、オブジェクトを切り替えpositionて選択したタブを決定し、次のように FragmentManager を使用してフラグメントを新しいインスタンスに設定しますgetFragmentManager().beginTransaction().replace(R.id.container, fragment).commit()

マップを保持するフラグメントを作成します。

  1. Fragmentタブのフラグメントとして使用するために拡張するクラスを作成します。[ 1 ] を読んで、MapFragment をよりよく理解してください。
  2. フラグメント要素を含むレイアウト XML ファイルを作成します ([ 1 ] を参照)。そのページの XML を使用してレイアウト XML ファイルを作成し、フラグメント クラスで使用します。
  3. をオーバーライドして、フラグメント クラスでそのレイアウト XML ファイルを拡張しますonCreateView
  4. これで、アプリはフラグメント クラスを使用するタブにマップを表示するはずですが、別のタブに切り替えてからマップ タブに戻ると、ビュー ID が重複します。これを克服するには、次のステップに進みます。
  5. フラグメント クラスで、次のメソッドをオーバーライドして、基になる GoogleMap オブジェクトを具体的に破棄し、マップ タブがフラグメント クラスを再度読み込んだときに再作成できるようにします。

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        MapFragment f = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
        if (f != null) 
            getFragmentManager().beginTransaction().remove(f).commit();
    }
于 2013-01-22T19:58:02.240 に答える
-1

すでに解決したかどうかはわかりません。それを機能させるには、Google Play サービスをライブラリ プロジェクトとして追加する必要があります。最初にjarファイルを追加しようとしましたが、うまくいきませんでした。

于 2013-01-17T21:53:02.573 に答える