Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:在片段之间传递对象_Java_Android_Android Fragments - Fatal编程技术网

Java Android:在片段之间传递对象

Java Android:在片段之间传递对象,java,android,android-fragments,Java,Android,Android Fragments,在开始之前,我已经仔细研究了以下问题: 以及Android文档: 除了这篇文章: 虽然上面提到的所有案例都与我的相似,但并不完全相同。我在这里遵循了一个很好的教程(我的部分代码基于本文): 我有以下文件: RegisterActivity.java NonSwipeableViewPager.java ScreenSliderAdapter.java RegisterOneFragment.java registerwofragment.java 以及以下布局: 活动\u regist

在开始之前,我已经仔细研究了以下问题:

以及Android文档:

除了这篇文章:

虽然上面提到的所有案例都与我的相似,但并不完全相同。我在这里遵循了一个很好的教程(我的部分代码基于本文):

我有以下文件:

RegisterActivity.java
NonSwipeableViewPager.java
ScreenSliderAdapter.java
RegisterOneFragment.java
registerwofragment.java

以及以下布局:

活动\u register.xml
fragment\u register\u one.xml
fragment\u register\u two.xml

我试图实现的是将一个可序列化对象从RegisterFragmentOne传递到RegisterFragmentTwo

到目前为止,这就是我所做的(省略了一些代码):

RegisterActivity.java

public class RegisterActivity extends FragmentActivity
             implements RegisterOneFragment.OnEmailRegisteredListener{

    public static NonSwipeableViewPager viewPager;
    private ScreenSliderAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        // Initilization
        mAdapter = new ScreenSliderAdapter(getSupportFragmentManager());
        viewPager = (NonSwipeableViewPager) findViewById(R.id.pager);
        viewPager.setAdapter(mAdapter);
    }

    public void onEmailRegistered(int position, Registration regData){
        Bundle args = new Bundle();
        args.putSerializable("regData", regData);
        viewPager.setCurrentItem(position, true);
    }
}
public class ScreenSliderAdapter extends FragmentPagerAdapter{

    public ScreenSliderAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int index) {

        switch (index) {
        case 0:
            return new RegisterOneFragment();
        case 1:
            return new RegisterTwoFragment();
        case 2:
            return new RegisterThreeFragment();
        }

        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }
}
public class RegisterOneFragment extends Fragment {
    OnEmailRegisteredListener mCallBack;
    public interface OnEmailRegisteredListener {
        /** Called by RegisterOneFragment when an email is registered */
        public void onEmailRegistered(int position, Registration regData);
    }

public void onAttach(Activity activity){
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception.
    try {
        mCallBack = (OnEmailRegisteredListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnEmailRegisteredListener");
    }
}

... And some to execute some HTTP request via separate thread...
}
ScreenSliderAdapter.java

public class RegisterActivity extends FragmentActivity
             implements RegisterOneFragment.OnEmailRegisteredListener{

    public static NonSwipeableViewPager viewPager;
    private ScreenSliderAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        // Initilization
        mAdapter = new ScreenSliderAdapter(getSupportFragmentManager());
        viewPager = (NonSwipeableViewPager) findViewById(R.id.pager);
        viewPager.setAdapter(mAdapter);
    }

    public void onEmailRegistered(int position, Registration regData){
        Bundle args = new Bundle();
        args.putSerializable("regData", regData);
        viewPager.setCurrentItem(position, true);
    }
}
public class ScreenSliderAdapter extends FragmentPagerAdapter{

    public ScreenSliderAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int index) {

        switch (index) {
        case 0:
            return new RegisterOneFragment();
        case 1:
            return new RegisterTwoFragment();
        case 2:
            return new RegisterThreeFragment();
        }

        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }
}
public class RegisterOneFragment extends Fragment {
    OnEmailRegisteredListener mCallBack;
    public interface OnEmailRegisteredListener {
        /** Called by RegisterOneFragment when an email is registered */
        public void onEmailRegistered(int position, Registration regData);
    }

public void onAttach(Activity activity){
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception.
    try {
        mCallBack = (OnEmailRegisteredListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnEmailRegisteredListener");
    }
}

... And some to execute some HTTP request via separate thread...
}
NonSwipeableViewPager.java(扩展ViewPager类,并覆盖以下内容)

RegisterOneFragment.java

public class RegisterActivity extends FragmentActivity
             implements RegisterOneFragment.OnEmailRegisteredListener{

    public static NonSwipeableViewPager viewPager;
    private ScreenSliderAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        // Initilization
        mAdapter = new ScreenSliderAdapter(getSupportFragmentManager());
        viewPager = (NonSwipeableViewPager) findViewById(R.id.pager);
        viewPager.setAdapter(mAdapter);
    }

    public void onEmailRegistered(int position, Registration regData){
        Bundle args = new Bundle();
        args.putSerializable("regData", regData);
        viewPager.setCurrentItem(position, true);
    }
}
public class ScreenSliderAdapter extends FragmentPagerAdapter{

    public ScreenSliderAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int index) {

        switch (index) {
        case 0:
            return new RegisterOneFragment();
        case 1:
            return new RegisterTwoFragment();
        case 2:
            return new RegisterThreeFragment();
        }

        return null;
    }

    @Override
    public int getCount() {
        return 3;
    }
}
public class RegisterOneFragment extends Fragment {
    OnEmailRegisteredListener mCallBack;
    public interface OnEmailRegisteredListener {
        /** Called by RegisterOneFragment when an email is registered */
        public void onEmailRegistered(int position, Registration regData);
    }

public void onAttach(Activity activity){
    super.onAttach(activity);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception.
    try {
        mCallBack = (OnEmailRegisteredListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnEmailRegisteredListener");
    }
}

... And some to execute some HTTP request via separate thread...
}
我试图实现的是,当用户按下RegisterOnFragment上的按钮时,数据将被发送到服务器(并通过JSON返回一些验证)。如果返回的数据有效,应用程序应该转到下一个片段,即RegistrationTwoFragment

对于如何在片段之间传递对象,我感到有些困惑,因为我的片段是使用适配器创建的。然后,该适配器连接到我的活动

有人能帮我吗?Thx

编辑1:

我试着做一个这样的捷径(不幸的是不起作用):

在我创建的RegisterActivity中:

public Registration regData;
在本节中:

/* PLACED ON POST EXECUTE */
((RegisterActivity)getActivity()).regData = regData;
最后在RegisterWoFragment中调用了它

Registration regData;
regData = ((RegisterActivity) getActivity()).regData;
它抛出一个nullPointerExceptions

编辑2


需要明确的是,RegisterActivity包含多个片段。用户在片段之间导航的唯一方法是单击按钮。该活动没有选项卡栏。

我通常会在包含该活动的过程中使用类似的设置器或方法

因此,如果我理解正确,您希望用户访问
RegistrationOneFragment
,然后在完成后,使用此数据,验证它,如果有效,将其传递给
RegistrationTwoFragment
,并将用户移动到此
Fragment

您是否可以在
onEmailRegistered
方法中调用
validateJson(regData)
来处理活动中的验证,如果成功,请将事务提交到
RegistrationTwoFragment

然后,您只需要在活动或片段中使用getter和setter,在活动中使用
getRegistrationOneData()
,或在片段中使用
setData(注册参数)
,如上面的示例所示


我不知道如何将args直接传递到片段中。

我找到了我的问题的解决方案,我确信这不是正确的方法

因此,在RegisterActivity.java中,我添加并修改了以下几行(thx到@sturrockad):

然后在RegisterWoFragments.java中(或在我想要接收对象的片段中):


通过对自定义对象实现可序列化,可以很容易地共享对象。我写了一篇关于这个的教程

从片段一开始:

android.support.v4.app.FragmentTransaction ft = 
    getActivity().getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
OfficeCategoryFragment frag = new OfficeCategoryFragment();

Bundle bundles = new Bundle();
Division aDivision = divisionList.get(position);

// ensure your object has not null
if (aDivision != null) {
    bundles.putSerializable("aDivision", aDivision);
    Log.e("aDivision", "is valid");
} else {
    Log.e("aDivision", "is null");
}
frag.setArguments(bundles);
ft.replace(android.R.id.content, frag);
ft.addToBackStack(null);
ft.commit();
第二部分:

Bundle bundle = getArguments();
Division division= (Division) bundle.getSerializable("aDivision");
Log.e("division TEST", "" + division.getName());

我过去常常将对象设置为PaceAble或Serializable以进行传输,但每当我向对象(模型)添加其他变量时,我都必须将其全部注册。太不方便了

在活动或片段之间传输对象非常容易

  • 将数据对象放在活动或片段中的KimchiDataCache实例中

    User userItem = new User(1, "KimKevin");  // Sample Model
    
    KimchiDataCache.getInstance().put(userItem);
    
    // add your activity or fragment
    
  • 在添加的片段的活动中获取数据对象

    public class MainFragment extends Fragment{
         private User userItem;
    
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
    
             userItem = KimchiDataCache.getInstance().get(User.class);
         }
    

  • 是的,这正是我试图用我的代码做的。关于您的解决方案,这是否意味着我不必使用适配器?同时,我会尽量听从你的建议。Thx…如果您想保留寻呼机和适配器,那么您应该保留它,但我认为您也可以使用supportFragmentManager()和事务轻松处理它。我想您是对的,只是我正在尽可能少的努力来完成这项工作…很高兴提供帮助。如果您对get()方法解决方案感到满意,请接受答案。这具有singleton模式的行为,这是一种非常反模式,它的痛苦在于单元测试。对于尝试以较少的努力完成类似操作的人:使用google gson将pojo序列化为json,并将其与捆绑包一起发送(setArguments)。对于试图以较少的努力完成类似工作的人:使用google gson将pojo序列化为json,并将其与捆绑包一起发送。这更好,因为您不需要为每个对象实现可序列化,并且当您更改对象属性(在后端)时,您不需要更改可序列化的实现。您能告诉我们