0

私は、RecyclerViewを含むFragment(SearchResultsFragment)を持っています。検索結果はRecyclerViewにロードされます(これは一連のCardViewです)。Android Error Inflating View

ユーザがCardViewを選択すると、選択したカードのデータがロードされる別のフラグメント(EventDetailsFragment)に移動します。これはすべてうまくいきますが、私が今抱えている唯一の問題は、ユーザーが電話で戻るボタンを選択するとアプリケーションがクラッシュし、XMLファイルを拡張できないというエラーが表示されることです。

私はこれが私のRecyclerViewと関係するかもしれないという疑いがあります。

E/UncaughtException: android.view.InflateException: Binary XML file line #18: Binary XML file line #18: Error inflating class fragment 

私も、このエラーを取得:

Caused by: java.lang.IllegalArgumentException: Binary XML file line #18: Duplicate id 0x7f0f0159, tag null, or parent id 0x7f0f0158 with another fragment for com.google.android.gms.location.places.ui.PlaceAutocompleteFragment 

ここでは私のSearchResultsFragment上のコードです:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View currentView = inflater.inflate(R.layout.fragment_start_search, container, false); 
    resolvingError = savedInstanceState != null && savedInstanceState.getBoolean(RESOLVING_ERROR, false); 
    initializeComponents(currentView); 
    buildGoogleApi(); 
    handlePermissions(); 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 
     getDeviceSuggestedLocations(); 
    } 
    return currentView; 
} 

private void initializeComponents(final View currentView) { 
    searchResultsRecyclerView = (RecyclerView) currentView.findViewById(R.id.EventSearchResultsRecyclerView); 
    searchResultsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    autoCompleteFragment = (PlaceAutocompleteFragment) getChildFragmentManager().findFragmentById(R.id.GoogleSearchFragment); 
    autoCompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { 
     @Override 
     public void onPlaceSelected(Place place) { 
      currentLocation = place.getName().toString(); 
      selectedPlace = place; 
      processSearch(); 
     } 
     @Override 
     public void onError(Status status) { 
      displayMessage("Error Getting Location", status.getStatusMessage()); 
     } 
    }); 

} 

これは、戻るボタンが押されたときに膨張するように失敗したXMLファイルであります:

<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" 
      tools:context="Fragments.StartSearchFragment" 
      android:orientation="vertical" 
      > 
<android.support.v7.widget.CardView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    > 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id ="@+id/SearchLinearLayout" 
     android:orientation="vertical"> 
     <fragment 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id = "@+id/GoogleSearchFragment" 
      android:name="com.google.android.gms.location.places.ui.PlaceAutocompleteFragment"></fragment> 
    </LinearLayout> 
</android.support.v7.widget.CardView> 
    <android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id = "@+id/EventSearchResultsRecyclerView" 
     android:layout_margin="5dp"> 
    </android.support.v7.widget.RecyclerView> 
</LinearLayout> 

EDIT:これは、断片は、ホットスワップを得る活動(MainActivity)である - 選ばれるものに応じて:StackOverflowの上でこのスレッドを参照して

public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 
private Toolbar mainActivityToolbar; 
private TextView toolbarTextView; 
private ImageView toolbarImage; 
private FragmentManager mgr; 
private NavigationView navigationView; 
private DrawerLayout drawerLayout; 
private ActionBarDrawerToggle drawerToggle; 
private SharedPreferences activityPreferences; 
private SharedPreferences appSharedPreferences; 
private SharedPreferences.Editor editor; 

protected void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState == null) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initializeControls(); 
     loadLandingScreenFragment(); 
    } else { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initializeControls(); 
    } 
} 

public void initializeControls() 
{ 
    mainActivityToolbar = (Toolbar) findViewById(R.id.MainActivityToolbar); 
    toolbarTextView = (TextView) findViewById(R.id.MainActivityTextView); 
    toolbarImage = (ImageView) findViewById(R.id.MainActivityImageView); 
    drawerLayout = (DrawerLayout) findViewById(R.id.menuDrawerLayout); 
    navigationView = (NavigationView) findViewById(R.id.mainActivityNavigationView); 
    setSupportActionBar(mainActivityToolbar); 
    getSupportActionBar().setTitle(null); 
    getSupportActionBar().setHomeButtonEnabled(true); 
    getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(true); 
    drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, mainActivityToolbar, R.string 
      .app_name, R 
      .string 
      .app_name); 
    drawerLayout.setDrawerListener(drawerToggle); 
    navigationView.inflateHeaderView(R.layout.navigation_menu_header); 
    navigationView.inflateMenu(R.menu.athlete_navigation_menu); 
    toolbarImage.setOnClickListener(this); 
    appSharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    activityPreferences = getSharedPreferences("iBaleka", MODE_PRIVATE); 
    editor = activityPreferences.edit(); 
    NavigationMenuOnItemSelectedListener listener = new NavigationMenuOnItemSelectedListener 
      (this); 
    navigationView.setNavigationItemSelectedListener(listener); 
    toolbarImage.setImageResource(R.drawable.ibaleka_logo); 
    mgr = getFragmentManager(); 
    mapComponents(); 

} 
public void loadLandingScreenFragment() 
{ 
    AthleteLandingFragment landingFragment = new AthleteLandingFragment(); 
    FragmentTransaction transaction = mgr.beginTransaction(); 
    transaction.replace(R.id.MainActivityContentArea, landingFragment, "UserStats"); 
    transaction.addToBackStack("UserStats"); 
    transaction.commit(); 
} 

private void mapComponents() 
{ 
    View headerView = navigationView.getHeaderView(0); 
    TextView athleteNameSurname = (TextView) headerView.findViewById(R.id.profileNameSurname); 
    TextView emailAddress = (TextView) headerView.findViewById(R.id.profileEmailAddress); 

    String nameSurname = appSharedPreferences.getString("Name", "") + " "+ appSharedPreferences.getString("Surname", ""); 
    athleteNameSurname.setText(nameSurname); 
    emailAddress.setText(appSharedPreferences.getString("EmailAddress", "").toLowerCase()); 

} 
@Override 
protected void onPause() { 
    editor.putString("ToolbarText", toolbarTextView.getText().toString()); 
    editor.commit(); 
    super.onPause(); 
} 
protected void onResume() { 
    super.onResume(); 
    toolbarTextView.setText(activityPreferences.getString("ToolbarText", "")); 
} 
@Override 
public void onBackPressed() { 
    if (mgr.getBackStackEntryCount() > 0) { 
     mgr.popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 

} 
+0

問題はフラグメントをロードする方法です。あなたは、別の断片の中に断片を持っているので、親断片から子断片を膨らませる方法を調べる必要があります。 – Eenvincible

+0

あなたの活動のコードを表示できますか?フラグメントを2回追加しようとしている疑いがあります。1回はアクティビティの最初の開始時に、もう1回はアクティビティに戻るときです。プログラムでフラグメントを追加する場合は、それらがフラグメントマネージャにまだ存在していないかどうかを確認する必要があります。 –

+0

あなたの活動のコードを投稿してください。 android:id = "@ + id/GoogleSearchFragment"が2回追加されたようです。一度xmlで、もう一度コードで。 – Rafal

答えて

0

Binary XML file line #26: Duplicate id, tag null, or parent id with another fragment

それは私の問題は、ということでしたが判明フラグメントレイアウトの中にタグがありました。これは明らかに不可能です。解決策は、タグをLinearLayoutタグに変更し、FragmentManagerを使用してPlaceAutocompleteFragmentをLinearLayoutにロードすることでした。

新しいXML(フラグメントタグを変更して):

<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" 
      tools:context="Fragments.StartSearchFragment" 
      android:orientation="vertical" 
    > 
<android.support.v7.widget.CardView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    > 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id ="@+id/SearchLinearLayout" 
     android:orientation="vertical"> 
     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id = "@+id/GoogleSearchFragment" 
      android:orientation="vertical"> 
     </LinearLayout> 
    </LinearLayout> 
</android.support.v7.widget.CardView> 
    <android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id = "@+id/EventSearchResultsRecyclerView" 
     android:layout_margin="5dp"> 
    </android.support.v7.widget.RecyclerView> 
</LinearLayout> 

次に、PlacesAutocompleteFragmentロードするためにFragmentManagerを使用します。

@Override 
public void onDestroyView() { 
    super.onDestroyView(); 
    FragmentManager manager = getActivity().getFragmentManager(); 
    Fragment fragment = manager.findFragmentById(R.id.GoogleSearchFragment); 
    FragmentTransaction trans = manager.beginTransaction(); 
    trans.remove(fragment); 
    trans.commit(); 
} 
:次に

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View currentView = inflater.inflate(R.layout.fragment_start_search, container, false); 

    initializeComponents(currentView, savedInstanceState); 
    resolvingError = savedInstanceState != null && savedInstanceState.getBoolean(RESOLVING_ERROR, false); 
    buildGoogleApi(); 
    handlePermissions(); 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 
     getDeviceSuggestedLocations(); 
    } 
    return currentView; 
} 

private void initializeComponents(View currentView, Bundle savedInstanceState) { 
    searchResultsRecyclerView = (RecyclerView) currentView.findViewById(R.id.EventSearchResultsRecyclerView); 
    searchResultsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    autoCompleteFragment = new PlaceAutocompleteFragment(); 
    autoCompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() { 
      @Override 
      public void onPlaceSelected(Place place) { 
       currentLocation = place.getName().toString(); 
       selectedPlace = place; 
       processSearch(); 
      } 
      @Override 
      public void onError(Status status) { 
       displayMessage("Error Getting Location", status.getStatusMessage()); 
      } 
     }); 
    FragmentManager mgr = getFragmentManager(); 
    FragmentTransaction transaction = mgr.beginTransaction(); 
    transaction.replace(R.id.GoogleSearchFragment, autoCompleteFragment, "AutoSearchFragment"); 
    transaction.commit(); 
} 

を、onDestroyViewメソッドをオーバーライド

関連する問題