2016-10-23 5 views
0

私はAndroid向けの新機能ですので、これは非常に明白な間違いです。Googleマップをフラグメント内に動的に表示しようとしましたが、エラーが発生しました。クラスフラグメントがエラーになります

Googleマップを表示するためにフラグメントを取得しようとしていますが、アプリケーションをクラッシュさせています。エラーメッセージは

"java.lang.RuntimeException:アクティビティを開始できませんでしたComponentInfo {com.example.daniel.mts/com.example.daniel.mts.MainActivity}:android.view.InflateException:バイナリXMLファイルの行#12:クラスフラグメントを拡張するエラー "

私のMainActivityはツールバーを表示し、activity_main.xml内のFrameLayoutをHomeFragmentに置き換えます。ここで

public class MainActivity extends AppCompatActivity 
implements OnFragmentInteractionListener { 

private DrawerLayout mDrawer; 
private Toolbar toolbar; 
private NavigationView nvDrawer; 
private ActionBarDrawerToggle drawerToggle; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //Set toolbar to replace the action bar 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    //find drawer view 
    mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawerToggle = setupDrawerToggle(); 

    //Tie drawerlayout events to the action bar toggle for open and  close 
    mDrawer.addDrawerListener(drawerToggle); 

    //Find our drawer view 
    nvDrawer = (NavigationView) findViewById(R.id.nvView); 

    //Setup drawer view 
    setUpDrawerContent(nvDrawer); 

    Fragment fragment = null; 
    Class fragmentClass = HomeFragment.class; 
    try { 
     fragment = (Fragment) fragmentClass.newInstance(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    FragmentTransaction def = getSupportFragmentManager().beginTransaction(); 
    def.replace(R.id.flContent, fragment); 
    def.commit(); 
} 

が私の活動のメインxmlファイル

<!-- This LinearLayout represents the contents of the screen --> 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <!-- The toolbar displayed at the top --> 
    <include 
     layout="@layout/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <!-- The main content view where fragments are loaded --> 
    <FrameLayout 
     android:id="@+id/flContent" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</LinearLayout> 

<!-- The navigation drawer that comes from the left --> 
<!-- android:layout_gravity needs to be set to 'start' --> 
<android.support.design.widget.NavigationView 
    android:id="@+id/nvView" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="@android:color/white" 
    app:menu="@menu/drawer_view" 
    app:headerLayout="@layout/nav_header" /> 

</android.support.v4.widget.DrawerLayout> 

マイHomeFragmentは、新しいフラグメントを作成からわずか定型コードが含まれている、それはこれがある

public class HomeFragment extends Fragment { 

// TODO: Rename parameter arguments, choose names that match 
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 

// TODO: Rename and change types of parameters 
private String mParam1; 
private String mParam2; 

private OnFragmentInteractionListener mListener; 

public HomeFragment() { 
    // Required empty public constructor 
} 

/** 
* Use this factory method to create a new instance of 
* this fragment using the provided parameters. 
* 
* @param param1 Parameter 1. 
* @param param2 Parameter 2. 
* @return A new instance of fragment HomeFragment. 
*/ 
// TODO: Rename and change types and number of parameters 
public static HomeFragment newInstance(String param1, String param2) { 
    HomeFragment fragment = new HomeFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    return inflater.inflate(R.layout.home_fragment, container, false); } 


// TODO: Rename method, update argument and hook method into UI event 
public void onButtonPressed(Uri uri) { 
    if (mListener != null) { 
     mListener.onFragmentMessage("hello", uri); 
    } 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof OnFragmentInteractionListener) { 
     mListener = (OnFragmentInteractionListener) context; 
    } else { 
     throw new RuntimeException(context.toString() 
       + " must implement OnFragmentInteractionListener"); 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    mListener = null; 
} 

/** 
* This interface must be implemented by activities that contain this 
* fragment to allow an interaction in this fragment to be communicated 
* to the activity and potentially other fragments contained in that 
* activity. 
* <p> 
* See the Android Training lesson <a href= 
* "http://developer.android.com/training/basics/fragments/communicating.htm l" 
* >Communicating with Other Fragments</a> for more information. 
*/ 
public void onFragmentMessage(String MSG, Object data) { 

} 

私home_fragment.xml表示します私のhome_fragment.xmlは、地図を表示すべき部分を表示します。

<FrameLayout 
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" 
tools:context="com.example.daniel.mts.HomeFragment"> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:text="@string/home_frag" /> 

<fragment 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.SupportMapFragment" /> 
</FrameLayout> 

これは私のマニフェストファイル

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.daniel.mts"> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_bus" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".MainActivity" 
     android:screenOrientation="portrait" 
     > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 

    <meta-data 
     android:name="com.google.android.geo.API_KEY" 
     android:value="@string/google_api_key"/> 
</application> 



</manifest> 

私がめちゃくちゃにしていますか? Fragmentsから基づい

+0

良い仕事です。エラーメッセージを追加するだけです。エラーメッセージの正確な言葉が何であるか、そしてどのコード行がそれを生成しているのかを教えてください。あなたの質問のタイトルの問題の簡単な概要。 [最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve)から – MikeJRamsey56

+0

@ MikeJRamsey56が更新されました、ありがとうございます – Odwall

答えて

0

は、あなたがいずれかのアクティビティレイアウトにフラグメントを追加するために、これらの2つの方法のいずれかを使用できます。

  • をアクティビティのレイアウトファイル内のフラグメントを宣言します。この場合

それはビューであるかのように、あなたは、フラグメントのレイアウトプロパティを指定することができます。

システムでこのアクティビティレイアウトが作成されると、レイアウトで指定された各フラグメントがインスタンス化され、それぞれのフラグメントのレイアウトを取得するためにそれぞれに対してonCreateView()メソッドが呼び出されます。システムは、フラグメントによって返されたビューを<fragment>要素の代わりに直接挿入します。

  • または、プログラムで既存のViewGroupにフラグメントを追加します。

(例えば、追加、削除、または断片を置換など)あなたの活動にフラグメント取引を行うには、FragmentTransactionからAPIを使用する必要があります。あなたはその後、追加し、それを挿入するにビューするフラグメントを指定して、add()方法を使用してフラグメントを追加することができます

FragmentManager fragmentManager = getFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

:あなたはこのようなあなたのActivityからFragmentTransactionのインスタンスを取得することができます。たとえば:

ExampleFragment fragment = new ExampleFragment(); 
fragmentTransaction.add(R.id.fragment_container, fragment); 
fragmentTransaction.commit(); 

あなたは完全な詳細について与えられたドキュメンテーションを確認することができます。

そして、それに加えて、あなたはまた、彼は、XMLからの断片を除去することにより、同様の問題を解決することができた特徴このSO postに@Edoardoモレニで使用する溶液を、試みること、活動のXMLでそれを挿入し、onCreateView (from the fragment class)に合格スーパークラスに渡します。

希望に役立ちます!

関連する問題