如何在Fragment之间传递数据?

2024-05-06

对于所有那些投反对票并投票决定关闭这个问题的人,认为它与 textview 的范围有关......然后看看,它与 textview 的范围无关

无法在片段之间传递数据,应用程序崩溃,我不知道我做错了什么...我点击了此链接http://manishkpr.webheavens.com/android-passing-data- Between-fragments/ http://manishkpr.webheavens.com/android-passing-data-between-fragments/

这是我正在使用的代码 片段A(该片段正在传递数据)

public class FragmentSongs extends  Fragment implements Serializable,OnFragmentCreatedListener {
ListView SngList;


 ArrayList<SongDetails> Songinfo=null;
AdapterView.AdapterContextMenuInfo info;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) 
{

    ViewGroup view = (ViewGroup) inflater.inflate(R.layout.fragment_song, null);

    SngList = (ListView) view.findViewById(R.id.SongList);
    registerForContextMenu(SngList);
    //File f=new File(Environment.getExternalStorageDirectory()+"/Music");
    File f=new File("/system/");
    int j=0;int i=0;

    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

      Songinfo = getSongsFromDirectory(f);



    //sorting done below
    if (Songinfo.size()>0)
    {

        for( j=0; j<Songinfo.size();j++)
        {
            for ( i=j+1 ; i<Songinfo.size(); i++)
            { 
                SongDetails a=Songinfo.get(i);
                SongDetails b=Songinfo.get(j);
                if(a.getSong().toLowerCase().compareTo(b.getSong().toLowerCase())<0)
                {   

                    Songinfo.set(i,b );
                    Songinfo.set(j,a);
                }
            }

        }






   SngList.setAdapter(new CustomAdapter(Songinfo));
   return view;
    }
    else return null;

}
OnFragmentCreatedListener listener;
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        listener = (OnFragmentCreatedListener) getActivity();
        listener.onFragmentCreated(Songinfo);
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement onFragmentCreated");
    }
}

片段B(接收者片段)

    public class FragmentArtists extends Fragment {
    ArrayList<SongDetails> songinfo2;
ViewGroup view;
int s=5;//TextView text;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
{Context context;
LayoutInflater lf = getActivity().getLayoutInflater();   

    view = (ViewGroup) inflater.inflate(R.layout.fragment_artist,  null);
// view =  lf.inflate(R.layout.test,container, false);
// view = inflater.inflate(R.layout.test,container, false);


 s=s+5;
//     text=(TextView)view.findViewById(R.id.tt);when i use this,it works fine but i want to do it in the other method

//text.setText("makzzz");when i use this,it works fine but i want to do it in the other method
return view;

}

 void setSongList(ArrayList<SongDetails> songinfo) 
{    //TextView text=(TextView)this.getView().findViewById(R.id.tt);//when i used this view was not global
      TextView text=(TextView)view.findViewById(R.id.tt);//when i used this,view was global;
      //TextView text=(TextView)view.findViewById(R.id.tt);
    // text=(TextView)super.getView().findViewById(R.id.tt);


     text.setText("makzzz");

持有者活动中的方法(此活动持有片段)

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mymusic);


           fragments = new Vector<Fragment>();
            fragments.add(Fragment.instantiate(this, FragmentSongs.class.getName()));
            fragments.add(Fragment.instantiate(this, FragmentArtists.class.getName()));
            fragments.add(Fragment.instantiate(this, FragmentPlaylists.class.getName()));
            fragments.add(Fragment.instantiate(this, FragmentAlbums.class.getName())); 


            ViewPagerAdapter adapter = new ViewPagerAdapter(super.getSupportFragmentManager(), fragments);


            ViewPager pager = (ViewPager)super.findViewById(R.id.viewpager);



            pager.setAdapter(adapter);
            pager.setOffscreenPageLimit(4);

            pager.setCurrentItem(0);

    }      public void onFragmentCreated(ArrayList<SongDetails> msg) {
            FragmentArtists Obj=(FragmentArtists)  fragments.get(1);
            Obj.setSongList(msg);
            }

    }

回调类:

package sourcecode.jazzplayer;

import java.util.ArrayList;

public interface OnFragmentCreatedListener {
    public void onFragmentCreated(ArrayList<SongDetails> msg);

}

这是日志猫

  09-19 23:50:46.851: E/AndroidRuntime(2125): java.lang.NullPointerException
09-19 23:50:46.851: E/AndroidRuntime(2125):     at sourcecode.jazzplayer.FragmentArtists.setSongList(FragmentArtists.java:55)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at sourcecode.jazzplayer.MyMusic.onFragmentCreated(MyMusic.java:45)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at sourcecode.jazzplayer.FragmentSongs.onAttach(FragmentSongs.java:128)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:883)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:823)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:819)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.support.v4.view.ViewPager.populate(ViewPager.java:1066)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.view.View.measure(View.java:12603)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.view.View.measure(View.java:12603)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.view.View.measure(View.java:12603)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2072)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.view.View.measure(View.java:12603)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1044)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.os.Looper.loop(Looper.java:137)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at android.app.ActivityThread.main(ActivityThread.java:4340)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at java.lang.reflect.Method.invokeNative(Native Method)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at java.lang.reflect.Method.invoke(Method.java:511)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-19 23:50:46.851: E/AndroidRuntime(2125):     at dalvik.system.NativeStart.main(Native Method)

错误在这行代码中

TextView 文本=(TextView)view.findViewById(R.id.tt); //这一行位于接收者片段(fragmentArtist)中


正如我在评论中已经说过的,你正在尝试与Fragment当它尚未正确初始化时。当。。。的时候FragmentSongs附于Activity(要求采取的行动ViewPager它将出现的地方)其onAttach()方法被调用。在这个方法中,你投射了Activity给你的听众,但你也立即调用侦听器的回调。这将使您的应用程序崩溃(您发布的例外),因为在该侦听器中您正在尝试使用第二个的视图Fragment of the ViewPager, FragmentArtists. This Fragment尚未初始化,此时第一个片段ViewPager几乎没有附加到该活动,并且您已经在尝试使用第二个片段的视图,这显然会失败。

您链接到的教程很好,很简单,但是还可以(如果不转到该链接,我假设您的代码来自教程)。问题是您在更复杂的情况下使用了非常简单的场景中的代码(事实上,如果您在该教程的代码中插入当前代码,您将得到相同的异常(太早调用侦听器))。

应该在片段完全构建时使用该回调侦听器接口(例如当用户使用应用程序并选择一首歌曲并且您想向他显示应用程序的艺术家部分时(此时调用侦听器并使其通过) data)) 还仔细处理片段不可用的可能性。

如果您需要在片段生命周期的早期在片段之间传递数据,以至于无法保证片段可用(就像在onAttach()一个片段)然后实现片段来获取数据directly从活动构建时的生命周期方法之一中获取。您要传递的内容尚不清楚,因此我在这里无话可说。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Fragment之间传递数据? 的相关文章

随机推荐

  • 如何使用SQL Server CE的动态连接字符串?

    我在 Windows 应用程序中使用 SQL Server CE 4 0 并使用实体框架创建它的模型 它工作正常 但我的问题是它没有构造函数来更改连接字符串 并且默认情况下它从app config file using var Contex
  • 为什么 JavaScript 原型属性在新对象上未定义?

    我对 JavaScript 原型概念还很陌生 考虑以下代码 var x function func x prototype log function console log 1 var b new x 据我了解 b log 应该返回 1 因
  • Marshmallow 中的手电筒控制

    我对最新 Marshmallow 版本中的相机 更具体地说是手电筒 有疑问 在任何棉花糖之前的版本上 我需要执行以下操作来打开 关闭闪光灯 private void turnFlashOn final Camera camera int f
  • TensorFlow - 为什么这个 softmax 回归没有学到任何东西?

    我的目标是用 TensorFlow 做大事 但我正在尝试从小事做起 我有一些小的灰度方块 有一点噪音 我想根据它们的颜色对它们进行分类 例如 3 个类别 黑色 灰色 白色 我编写了一个小 Python 类来生成正方形和 1 hot 向量 并
  • 结构体前向声明编译失败

    我有以下代码 但编译器说 sender wrapper 未定义 即使我向前声明了它 我不能对结构进行前向声明吗 用VS2003编译 struct send wrapper struct IPSend IPSend IPSend const
  • 不能需要本地 CoffeeScript 模块

    我正在运行 Node js 0 10 21 我尝试了 CoffeeScript 1 6 3 并掌握了有和没有的情况require coffee script extensions 当然 将这两个文件编译为 JavaScript 并直接在 N
  • 如何随机生成文件的链接?

    我有一个 PDF 文件 我不想通过我网站上的 URL 公开访问该文件 作为 轻微 安全层 我想通过电子邮件向用户发送一个唯一的 随机生成的 URL 他们可以从中下载 PDF 我将把该 PDF 存储在 AWS 或类似的地方 我感觉自己被困在r
  • Erlang:如何将小数转换为填充零的十六进制字符串

    我想在 Erlang 中将 42 基数 10 转换为 000002A 基数 16 我在网上找到了一些提示 io format 8 0B n 42 gt 00000042 And io format 16B n 42 gt 2A 但我似乎无法
  • 对需要强制转换的 Java 泛型感到困惑

    我对以下代码感到困惑 import java util ArrayList import java util LinkedList import java util List public class GenericsTest
  • 为什么 Swift 中会出现“使用未声明类型 UITableView”的情况?

    我是新来的Swift 我创建了第二个swift file call DeviceInfo swift并添加一个UIViewcontroller in Main storyboard 我还添加一个UITableView in UIViewco
  • 如何更新多个字段,包括django模型实例的相关字段?

    我想知道 更新多个字段 包括 django 中模型实例的相关字段 的标准方法是什么 Class User models Model id models CharField name models CharField dob models C
  • 返回 OSError 异常类的子类实例的逻辑在哪里?

    我一直在寻找一些对某些人来说可能相对愚蠢的东西 但对我来说非常有趣 输入和输出错误已合并为OSError在 Python 3 3 中 异常类层次结构发生了变化 关于内置类的一个有趣的特性OSError是这样 它在传递时返回它的子类errno
  • 自定义指令模型在 ng-switch 中不起作用

    我试图使用 AngularJS 提供一个可切换的下拉列表 其中选择各种选项将触发不同的列表 ng switch似乎是正确的方法 但我的ng model在内部时不具有约束力ng switch 如果我不使用 绑定工作正常ng switch 但如
  • > 有必要吗?

    我现在开发网站和 XML 接口已有 7 年了 从来没有遇到过真正有必要使用 gt for a gt 到目前为止 所有消歧都可以通过引用来处理 lt and alone 有没有人遇到过这样的情况 与 SGML 处理 浏览器问题 XSLT 等相
  • QuickBlox:arm64 架构的未定义符号

    我使用 Xcode 6 4 并使用 cocoapods 安装了 QuickBlox 框架 使用该框架后 我收到一些错误 例如 Undefined symbols for architecture arm64 OBJC CLASS QBSet
  • Fluent NHibernate 一对一映射

    我很难利用 Fluent NHibernate 的 HasOne 映射 基本上 A 类在 B 类中可以有匹配的 只有一条或没有 记录 请帮助定义关系的 AMap 和 BMap 类 谢谢 public class A public virtu
  • xCode Cocoapods 构建失败“架构 x86_64 的未定义符号”

    我想为模拟器和真实设备构建我的 Xcode 项目 本地反应和快速 模拟器效果很好 今天我尝试为我的设备构建它 我在 Xcode 栏中选择了我的设备并添加了要发布的方案 我必须这样做 因为我使用的是 React Native 否则捆绑包未打包
  • 如何替换带引号的多单词字符串作为参数?

    我正在尝试替换包含多个带引号的单词的字符串变量作为命令的参数 因此 给出以下示例脚本 请注意 shebang 中的 x 这会导致输出被记录到 stderr bin bash x myArg hello world echo string i
  • 为什么(错误地)使用 ref myarray[0] 传递数组可以工作,但仅在 32 位应用程序中有效?

    我在一些互操作中做了一些愚蠢的事情 使用DllImport 在某一时刻 但它仍然可以在 32 位机器上运行 在 64 位应用程序上做了哪些不同的操作 以及为什么 导致方法 1 的行为不同 方法一 错误的方法 ref byte param S
  • 如何在Fragment之间传递数据?

    对于所有那些投反对票并投票决定关闭这个问题的人 认为它与 textview 的范围有关 然后看看 它与 textview 的范围无关 无法在片段之间传递数据 应用程序崩溃 我不知道我做错了什么 我点击了此链接http manishkpr w