调用 new Activity 时出现 IllegalArgumentException
IllegalArgumentException when calling new Activity
在我的 MainActivity 中,我有一个片段,我用另一个片段替换了它 class。
替换 MainActivity 中的片段:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, MainFragment.newInstance())
.commit();
MainActivity 的 XML:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways"
app:titleTextColor="@android:color/white" />
</android.support.design.widget.AppBarLayout>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</FrameLayout>
这很好用。
问题现在出在我的 Fragment class 中。我想从片段 class 调用一个新的 Activty (DetailRfrdPastActivity)。只要我向 DetailRfrdPastActivity XML 添加一个元素,应用就会停止并出现以下错误:
java.lang.IllegalArgumentException: No view found for id 0x7f0c0071
(com.scherrer.robin.chvote:id/touch_outside) for fragment
MainFragment{610d48e #0 id=0x7f0c0071}
at
android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1098)
at
android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1286)
at
android.support.v4.app.BackStackRecord.run(BackStackRecord.java:758)
at
android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1671)
at
android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:532)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
在片段 class 中,我这样开始 activity:
public class MainFragment extends Fragment implements SearchView.OnQueryTextListener, FlexibleAdapter.OnItemClickListener {
public static MainFragment newInstance() {
return new MainFragment();
}
private RecyclerView mRecyclerView;
private FlexibleAdapter<IFlexible> mAdapter;
private List<IFlexible> originalItems;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_main, container, false);
mRecyclerView = (RecyclerView) view.findViewById(R.id.lvRef);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setHasOptionsMenu(true);
this.mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
originalItems = AdapterData.getRfrdList();
mAdapter = new FlexibleAdapter<>(AdapterData.getRfrdList());
mAdapter.showAllHeaders();
mAdapter.initializeListeners(this);
mRecyclerView.setAdapter(mAdapter);
mAdapter.enableStickyHeaders();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_main, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
}
@Override
public boolean onQueryTextChange(String query) {
List<IFlexible> copyOriginalItems = new ArrayList<>(originalItems);
mAdapter.setSearchText(query);
mAdapter.filterItems(copyOriginalItems);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onItemClick(int itemPosition) {
IFlexible clickedItem = mAdapter.getItem(itemPosition);
if (clickedItem instanceof ItemRfrdPast) {
Intent detailRfrdPast = new Intent(getActivity().getApplicationContext(), DetailRfrdPastActivity.class);
detailRfrdPast.putExtra("pastRfrd", ((ItemRfrdPast) clickedItem).getPastRfrd());
getActivity().startActivity(detailRfrdPast);
}
return true;
}
}
XML 片段:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/lvRef"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
<include layout="@layout/sticky_header_layout"/>
DetailRfrdPastActivity 是 MainActivity 的子项 activity。
我不知道错误在哪里,因为片段和被调用的 activity 应该没有任何关系。
清单:
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".activities.MainActivity"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activities.DetailRfrdPastActivity"
android:parentActivityName=".activities.MainActivity" >
</activity>
</application>
显示您的 MainFragment xml 文件中缺少 ID 的视图:id/touch_outside。请在您的 xml 以及包含的 XMLs
中检查此 ID
替换
getSupportFragmentManager().beginTransaction()
和
getChildFragmentManager().beginTransaction()
为什么会这样?
May be because it can't find the Fragment with the given ID because it's in a different FragmentManager
.
参考difference
ftw,我认为从 ViewHolder 设置一个 onClickListener 并调用所选项目的回调会很好。
例如:
来自 FlexibleAdapter class
public interface OnIFlexibleClickListener {
void onIFlexibleClick(IFlexible iFlexible);
}
private OnIFlexibleClickListener listener;
public setOnIFlexibleClickListener(OnIFlexibleClickListener listener) {
this.listener = listener;
}
public IFlexible getIFlexible(int position) {
return iFlexibleList.get(position); //Your iFlexible List
}
public class FindViewHolder extends RecyclerView.ViewHolder {
private TextView textView; //Replace the TextView with your own view.
public FindViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView;
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onIFlexibleClick(getIFlexible(getAdapterPosition()));
}
}
});
}
}
从 MainFragment class,实现 OnIFlexibleClickListener
@Override
public void onIFlexibleClick(IFlexible iFlexible) {
if (iFlexible instanceof ItemRfrdPast) {
ItemRfrdPast itemRfrdPast = ((ItemRfrdPast) iFlexible).getPastRfrd()
Intent intent = new Intent(getContext(), DetailRfrdPastActivity.class);
intent.putExtra(PAST_RFRD, itemRfrdPast); //public static final String PAST_RFRD = "pastRfrd";
getActivity().startActivityForResult(intent, DetailRfrdPastActivity.REQUEST_CODE); //create a public static final int REQUEST_CODE
}
}
我认为这应该可以解决问题。干杯。
在我的 MainActivity 中,我有一个片段,我用另一个片段替换了它 class。
替换 MainActivity 中的片段:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, MainFragment.newInstance())
.commit();
MainActivity 的 XML:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways"
app:titleTextColor="@android:color/white" />
</android.support.design.widget.AppBarLayout>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
</FrameLayout>
这很好用。
问题现在出在我的 Fragment class 中。我想从片段 class 调用一个新的 Activty (DetailRfrdPastActivity)。只要我向 DetailRfrdPastActivity XML 添加一个元素,应用就会停止并出现以下错误:
java.lang.IllegalArgumentException: No view found for id 0x7f0c0071 (com.scherrer.robin.chvote:id/touch_outside) for fragment MainFragment{610d48e #0 id=0x7f0c0071} at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1098) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1286) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:758) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1671) at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:532) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
在片段 class 中,我这样开始 activity:
public class MainFragment extends Fragment implements SearchView.OnQueryTextListener, FlexibleAdapter.OnItemClickListener {
public static MainFragment newInstance() {
return new MainFragment();
}
private RecyclerView mRecyclerView;
private FlexibleAdapter<IFlexible> mAdapter;
private List<IFlexible> originalItems;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_main, container, false);
mRecyclerView = (RecyclerView) view.findViewById(R.id.lvRef);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setHasOptionsMenu(true);
this.mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
originalItems = AdapterData.getRfrdList();
mAdapter = new FlexibleAdapter<>(AdapterData.getRfrdList());
mAdapter.showAllHeaders();
mAdapter.initializeListeners(this);
mRecyclerView.setAdapter(mAdapter);
mAdapter.enableStickyHeaders();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_main, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
}
@Override
public boolean onQueryTextChange(String query) {
List<IFlexible> copyOriginalItems = new ArrayList<>(originalItems);
mAdapter.setSearchText(query);
mAdapter.filterItems(copyOriginalItems);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onItemClick(int itemPosition) {
IFlexible clickedItem = mAdapter.getItem(itemPosition);
if (clickedItem instanceof ItemRfrdPast) {
Intent detailRfrdPast = new Intent(getActivity().getApplicationContext(), DetailRfrdPastActivity.class);
detailRfrdPast.putExtra("pastRfrd", ((ItemRfrdPast) clickedItem).getPastRfrd());
getActivity().startActivity(detailRfrdPast);
}
return true;
}
}
XML 片段:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/lvRef"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
<include layout="@layout/sticky_header_layout"/>
DetailRfrdPastActivity 是 MainActivity 的子项 activity。 我不知道错误在哪里,因为片段和被调用的 activity 应该没有任何关系。
清单:
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".activities.MainActivity"
android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activities.DetailRfrdPastActivity"
android:parentActivityName=".activities.MainActivity" >
</activity>
</application>
显示您的 MainFragment xml 文件中缺少 ID 的视图:id/touch_outside。请在您的 xml 以及包含的 XMLs
中检查此 ID替换
getSupportFragmentManager().beginTransaction()
和
getChildFragmentManager().beginTransaction()
为什么会这样?
May be because it can't find the Fragment with the given ID because it's in a different
FragmentManager
.
参考difference
ftw,我认为从 ViewHolder 设置一个 onClickListener 并调用所选项目的回调会很好。
例如:
来自 FlexibleAdapter class
public interface OnIFlexibleClickListener {
void onIFlexibleClick(IFlexible iFlexible);
}
private OnIFlexibleClickListener listener;
public setOnIFlexibleClickListener(OnIFlexibleClickListener listener) {
this.listener = listener;
}
public IFlexible getIFlexible(int position) {
return iFlexibleList.get(position); //Your iFlexible List
}
public class FindViewHolder extends RecyclerView.ViewHolder {
private TextView textView; //Replace the TextView with your own view.
public FindViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView;
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onIFlexibleClick(getIFlexible(getAdapterPosition()));
}
}
});
}
}
从 MainFragment class,实现 OnIFlexibleClickListener
@Override
public void onIFlexibleClick(IFlexible iFlexible) {
if (iFlexible instanceof ItemRfrdPast) {
ItemRfrdPast itemRfrdPast = ((ItemRfrdPast) iFlexible).getPastRfrd()
Intent intent = new Intent(getContext(), DetailRfrdPastActivity.class);
intent.putExtra(PAST_RFRD, itemRfrdPast); //public static final String PAST_RFRD = "pastRfrd";
getActivity().startActivityForResult(intent, DetailRfrdPastActivity.REQUEST_CODE); //create a public static final int REQUEST_CODE
}
}
我认为这应该可以解决问题。干杯。