android – 启动片段活动

android – 启动片段活动,第1张

概述我有一个包含许多片段的应用程序,当点击一个按钮时,我试图从一个片段转到另一个片段. 我遇到麻烦的部分是startActivity(new Intent(HomeFragment.this,FindPeopleFragment.class)); package info.androidhive.slidingmenu;import info.androidhive.slidingmenu.Hom 我有一个包含许多片段的应用程序,当点击一个按钮时,我试图从一个片段转到另一个片段.

我遇到麻烦的部分是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:

顺便说一句….我使用这个代码并在其上工作:
http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer

解决方法 在Fragment中,您应该将托管活动(上下文)作为getActivity().试试这个:

startActivity(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 – 启动片段活动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1122214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存