私は、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();
}
}
問題はフラグメントをロードする方法です。あなたは、別の断片の中に断片を持っているので、親断片から子断片を膨らませる方法を調べる必要があります。 – Eenvincible
あなたの活動のコードを表示できますか?フラグメントを2回追加しようとしている疑いがあります。1回はアクティビティの最初の開始時に、もう1回はアクティビティに戻るときです。プログラムでフラグメントを追加する場合は、それらがフラグメントマネージャにまだ存在していないかどうかを確認する必要があります。 –
あなたの活動のコードを投稿してください。 android:id = "@ + id/GoogleSearchFragment"が2回追加されたようです。一度xmlで、もう一度コードで。 – Rafal