我遇到麻烦的部分是startActivity(new Intent(HomeFragment.this,FindPeopleFragment.class));
package info.androIDhive.slIDingmenu;import info.androIDhive.slIDingmenu.HomeFragment;import androID.app.Fragment;import androID.content.Intent;import androID.os.Bundle;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.Imagebutton;import androID.Widget.Toast;public class HomeFragment extends Fragment {public HomeFragment() {}Imagebutton bSearchByLocation,bSearchByNumber;@OverrIDepublic VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,Bundle savedInstanceState) { super.onCreateVIEw(inflater,container,savedInstanceState); VIEw inputFragmentVIEw = inflater.inflate(R.layout.fragment_home,false); bSearchByNumber = ((Imagebutton) inputFragmentVIEw .findVIEwByID(R.ID.bSearchByLocation)); bSearchByLocation = ((Imagebutton) inputFragmentVIEw .findVIEwByID(R.ID.bSearchByNumber)); bSearchByLocation.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { if (v.getID() == R.ID.bSearchByNumber) { Toast.makeText(getActivity(),"1",Toast.LENGTH_SHORT) .show(); startActivity(new Intent(HomeFragment.this,FindPeopleFragment.class)); } } }); bSearchByNumber.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { if (v.getID() == R.ID.bSearchByLocation) { Toast.makeText(getActivity(),"2",Toast.LENGTH_SHORT) .show(); } } }); return inputFragmentVIEw;}}@H_404_14@在我做解决方案后,代码看起来像这样:
package info.androIDhive.slIDingmenu;import info.androIDhive.slIDingmenu.HomeFragment;import androID.app.Fragment;import androID.content.Intent;import androID.os.Bundle;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.Toast;public class HomeFragment extends Fragment {public HomeFragment() {}Imagebutton bSearchByLocation,Toast.LENGTH_SHORT) .show(); startActivity(new Intent(getActivity(),Toast.LENGTH_SHORT) .show(); } } }); return inputFragmentVIEw;}}@H_404_14@但是当我运行它时,应用程序崩溃并关闭.
这是我的androIDmanifest代码:<?xml version="1.0" enCoding="utf-8"?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID"package="info.androIDhive.slIDingmenu"androID:versionCode="1"androID:versionname="1.0" ><uses-sdk androID:minSdkVersion="11" androID:targetSdkVersion="17" /><applicationandroID:allowBackup="true"androID:icon="@drawable/ic_launcher"androID:label="@string/app_name"androID:theme="@style/Apptheme" ><activity androID:name="info.androIDhive.slIDingmenu.MainActivity" androID:label="@string/app_name" > <intent-filter> <action androID:name="androID.intent.action.MAIN" /> <category androID:name="androID.intent.category.LAUNCHER" /> </intent-filter></activity><activity androID:name="info.androIDhive.slIDingmenu.FindPeopleFragment"></activity></application></manifest>@H_404_14@这是我的logchat:
顺便说一句….我使用这个代码并在其上工作:
解决方法 在Fragment中,您应该将托管活动(上下文)作为getActivity().试试这个:
http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawerstartActivity(new Intent(getActivity(),FindPeopleFragment.class));@H_404_14@在清单中声明FindPeopleFragment类:
<activity androID:name="com.packagename.FindPeopleFragment" />@H_404_14@必须在清单文件中声明所有活动(不是片段).
另外,检查FindPeopleFragment是否扩展了Activity或FragmentActivity.如果这扩展了Fragment,请不要执行Intent.您必须使FragmentTransaction替换(或添加上面)旧的Fragment(HomeFragment).
UPDATE
你实现这个目标的方式是错误的.您尝试启动一个新的Activity,在您的情况下,它是一个片段而不是一个活动(扩展片段).为此,您可以:
// call a method when click event((MyFragmentActivity) getActivity()).replaceFragments();@H_404_14@然后,在FragmentActivity中,将方法设置为:
// replace the fragment container with this methodpublic voID replaceFragments() { Fragment newFragment = new FindPeopleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.ID.fragment_container,newFragment); transaction.commit();}@H_404_14@UPDATE2
正如@Squonk在评论和his answer中所说,我上面的回答是一个解决方案,但不是正确的解决方案.要拥有一个非常合适的解决方案,您需要声明一个Callback接口并将Fragment与任何Activity相关联.
首先声明一个接口并将其附加到片段中的活动:
OnFragSelected mCallback;public interface OnFragSelected { public voID OnFragSelected(int ID);} @OverrIDepublic voID onAttach(Activity activity) { super.onAttach(activity); try { mCallback = (OnFragSelected) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString()+" must implement OnFragSelected interface.."); }}@H_404_14@然后在点击事件中调用此方法:
@OverrIDepublic voID onClick(VIEw v) { mCallback.OnFragSelected(800);}@H_404_14@最后,在你的片段活动中:
... implements HomeFragment.OnFragSelected { Fragment newFragment; @OverrIDe public voID OnFragSelected(int ID) { // example: ID = 800 // ... newFragment = new FindPeopleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.ID.fragment_container,newFragment); transaction.commit(); }}@H_404_14@这种方式“更灵活[…]多个活动现在可以嵌入你的片段,他们只需要实现通信接口”.这很重要,因为“您的片段可以重复使用,因此不依赖于特定的活动”.此外,如果您“在其他地方使用该片段,则可以消除RuntimeException的风险,因为它是强类型的.”
这个问题以及关于Fragment 2 fragment communicating的这些答案可以向您展示不同之处. Here,你有谷歌的例子和这个答案:onAttach callback from fragment to activity你可能想出来.
总结以上是内存溢出为你收集整理的android – 启动片段活动全部内容,希望文章能够帮你解决android – 启动片段活动所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)