当前位置: 首页 > 面试题库 >

Android:在片段之间传递对象

狄宪
2023-03-14
问题内容

以及Android文档:

http://developer.android.com/training/basics/fragments/communicating.html

以及本文:

http://manishkpr.webheavens.com/android-passing-data-between-
fragments/

尽管上述所有情况都与我的情况相似,但并不完全相同。我在这里遵循了一个很好的教程(我的代码的某些部分基于本文):

http://www.androidhive.info/2013/10/android-tab-layout-with-swipeable-
views-1/

我有以下文件:

RegisterActivity.java
NonSwipeableViewPager.java
ScreenSliderAdapter.java
RegisterOneFragment.java
RegisterTwoFragment.java

以及以下布局:

activity_register.xml
fragment_register_one.xml
fragment_register_two.xml

我想要实现的是将一个Serializable对象从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);
    }
}

ScreenSliderAdapter.java

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;
    }
}

NonSwipeableViewPager.java (扩展ViewPager类,并覆盖以下内容)

@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
    // Never allow swiping to switch between pages
    return false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // Never allow swiping to switch between pages
    return false;
}

RegisterOneFragment.java

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...
}

我要完成的工作是,只要用户按下RegisterOneFragment上的按钮,数据就会发送到服务器(并通过JSON返回一些验证)。如果返回的数据有效,则应用程序应转到下一个片段,即RegistrationTwoFragment。

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

谁能帮我这个?谢谢

编辑1:

我试图像这样创建一个快捷方式(不幸的是不起作用):

在RegisterActivity中,我创建了:

public Registration regData;

并在RegisterOneFragment中:

/* PLACED ON POST EXECUTE */
((RegisterActivity)getActivity()).regData = regData;

最后在Re​​gisterTwoFragment中将其称为

Registration regData;
regData = ((RegisterActivity) getActivity()).regData;

它抛出一个nullPointerExceptions

编辑2

只需清楚一点,RegisterActivty包含多个片段。用户唯一可在片段之间导航的方法是单击按钮。活动没有选项卡栏。


问题答案:

在包含活动中,我通常会具有与此类似的设置器或html" target="_blank">方法。

因此,如果我理解正确,则希望用户访问RegistrationOneFragment,然后在完成后使用此数据并对其进行验证,如果有效,RegistrationTwoFragment请将其传递给用户并将其移至此Fragment

你能简单地调用validateJson(regData)你的onEmailRegistered方法来处理您的活动验证,如果成功,提交一个事务RegistrationTwoFragment

然后,所有你需要的是getter和setter您的活动或片段说getRegistrationOneData()在活动中或setData(Registration args)在片段作为你的例子显示上方。

我不知道将args直接传递到Fragment的任何方法。



 类似资料:
  • 如何从secondactivity.java中的包到fragment_2.java文件中获取值?

  • 我正在开发一个由多个活动组成的Android应用程序,我必须在它们之间传递ab对象,但我不能通过使用意图传递它,因为对象的类没有实现可序列化,我怎么做?我无法修改我的类的源代码。谢谢:)

  • 这是我的代码,根据文档,它是用于: 我在这里找到了一个解决方案,但我并不真正理解它,因为它是用编写的,我也不理解。我需要帮助!! ---编辑----

  • 需要帮助在视图寻呼机中的片段之间传递数据!我们尝试将数据作为包传递到片段中。碎片内部。方法,并尝试从另一个片段获取数据。getArguments()。 活动代码 片段代码: 在片段之间传递数据时需要帮助

  • 我有两项活动。两者都已实现surfaceview。在第一个活动中,我有一个名为score1的变量,我想将score1中的值传递给第二个活动。 每次我运行应用程序时,它在完成第一个活动后崩溃,并尝试加载第二个活动。在我编写代码以获取第二个活动中的额外意图之前,一切都很好。 我的第一个活动有这样的意图: 在我的第二个活动中,以下代码试图获取score1变量的值: 我不明白为什么每次activity o

  • 我有一个包含两个片段的活动:一个用于在网格视图中显示产品,另一个用于显示用户添加到订单中的产品(ListFragment)。当用户在网格视图中单击一个产品时,我需要的是显示一个对话框(DialogFragment),我在其中询问所需产品的数量。然后,当用户在对话框中单击Accept时,我希望产品出现在ListFragment中。 一方面,我必须将产品对象传递给对话框,以便将其名称显示为对话框的标题