为片段提供论证的正确方法

时间:2016-06-13 08:54:06

标签: android

我有一个这样的课程:

public Class Row {
    private int data = 0;
    private View.OnClickListener callback = null;

    public void setData(int a) { data = a; }
    public void setOnClickListener(View.OnClickListener i) { callback = i; }
}

我喜欢将这个类的实例提供给Fragment。考虑到成员接口,我无法对此类进行序列化或包裹,并通过setArgument()发送。

你有什么建议把这个课提供给我的片段?我想到了3种方法,但我想知道什么更好:

1 - 通过setter函数提供类:

Myfrag frag = new Myfrag();
Row r = new Row();
r.setOnClickListener(this);
frag.setRow(r);
getSupportFragmentManager().beginTrasaction().add(R.id.containder_id, frag).commit();

有些人不鼓励使用此方法,因为似乎此方法可能会在Fragment娱乐时失败。

2 - 通过回调接口证明课程 在这种情况下,activity提供了一个返回Fragment的类的接口:

public class MyActivity extend Activity implements Myfrag.OnGetRow{
    private Row mRow = null;
    ...

    public createFragment() {
        Myfrag frag = new Myfrag();
        mRow = new Row();
        mRow.setOnClickListener(this);
        getSupportFragmentManager().beginTrasaction().add(R.id.containder_id, frag).commit();
    }

    public Row getRow() {
        return mRow;
    }
}

Fragment

public class MyFrag extend Fragment {
    ...
    public interface OnGetRow {
        public Row getRow();
    }

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

        OnGetRow mCallback  = null;

        try {
            mCallback = (OnGetRow) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
        }

        mRow = mCallback.getRow();
    }
}

3 - 只需为活动提供公开功能,并在onAttach()的{​​{1}}中进行调用。

你对这个问题有什么建议?

3 个答案:

答案 0 :(得分:0)

据我所知,更好的方法是使Row序列化并在bundle中设置Row的实例并将bundle设置为所需Fragment的参数,在重新创建之后,您可以使用函数getArguments()在onResume()方法中获取该bundle。这样你的数据就会持续存在。

答案 1 :(得分:0)

在我看来,最好的方法是,在这个例子中,我使用Dart liblary来减少片段中的代码;

public class MyFragment extends Fragment {

    private static final String FIRST_PARAM_KEY = "KEY1";
    private static final String SECOND_PARAM_KEY = "KEY2";

    @InjectExtra(FIRST_PARAM_KEY)
    Integer firstParam;
    @InjectExtra(SECOND_PARAM_KEY)
    String SecondParam;

    public static MyFragment newInstance(Integer param1, String param2) {
        Fragment fragment = new MyFragment();
        Bundle args = new Bundle();
        args.putInt(FIRST_PARAM_KEY, param1);
        args.putString(SECOND_PARAM_KEY, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Dart.inject(this, getArguments());
    }
}

每当您想要创建新片段时,请使用:Fragment fragment = MyFragment.newInstance(123, "text")。请记住,如果要传递对象,则该对象必须实现Parcelable

答案 2 :(得分:0)

最好的方法是将数据放在bundle中,将setArgument放在片段中。这是一个例子 - 假设我有一个UserModel类的Object传递给UserFragment。

public class UserModel  implements Parcelable{
    int id;
    String name;
    String profilePic;

    protected UserModel(Parcel in) {
        id = in.readInt();
        name = in.readString();
        profilePic = in.readString();
    }

    public static final Creator<UserModel> CREATOR = new Creator<UserModel>() {
        @Override
        public UserModel createFromParcel(Parcel in) {
            return new UserModel(in);
        }

        @Override
        public UserModel[] newArray(int size) {
            return new UserModel[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(id);
        dest.writeString(name);
        dest.writeString(profilePic);
    }
}

现在在UserFragement中这样做:

public class UserFragment extends Fragment {
    private UserModel userModel;
    private String userStr;
    public static Fragment getInstance(UserModel userModel, String userStr) {
        Bundle bundle = new Bundle();
        bundle.putParcelable("USER_DATA", userModel);
        bundle.putString("USER_STR", userStr);
        UserFragment userFragment = new UserFragment();
        userFragment.setArguments(bundle);
        return userFragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(getArguments() != null){
            Bundle bundle = new Bundle();
            userModel = bundle.getParcelable("USER_DATA");
            userStr = bundle.getString("USER_STR");
        }
    }
}

现在使用newInstance方法创建片段的新对象。

希望它会对你有所帮助:)。