片段getArgument()正确的位置

时间:2017-12-06 09:14:02

标签: android android-fragments

使用Fragments,我开始怀疑填充片段的正确方法。

正如文档所说,我使用newInstance()模式为我的片段添加参数:

public static ItemFragment newInstance(ItemRealm item, AnnaleModel model) {
    ItemFragment fragment = new ItemFragment();
    Bundle args = new Bundle();
    args.putString(MyPagerAdapter.KEY_ITEM, item.getId());
    args.putParcelable(MyPagerAdapter.KEY_MODEL, model);
    fragment.setArguments(args);
    return fragment;
}

但是,有一些我可以在网上看到的行为。

最常见的是将getArguments()放入onCreateView()方法并将结果放入字段中:

protected String itemId;
protected Model mModel ;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Bundle args = getArguments();
    if (args == null || (!args.containsKey(MyPagerAdapter.KEY_ITEM) || !args.containsKey(MyPagerAdapter.KEY_MODEL))) {
        Log.e("TAG", "incorrect Bundle");
        return null;
    }
    itemId = args.getString(MyPagerAdapter.KEY_ITEM);
    mModel = args.getParcelable(MyPagerAdapter.KEY_MODEL);
}

我可以在其他一些地方看到在Fragment.onCreate()方法而不是onCreateView()中使用相同的内容。

最后一种行为是在getter中调用getArguments()

private Model getModel(){
    if (getArguments() != null) {
        return getArguments().getParcelable(AnnalePagerAdapter.KEY_MODEL);
    }
    Log.e("Dan", "ItemFragment :: getModel (279): model==null !!");
    return null;
}//I can also think about some lazyloading is needed

问题是:

  • 现在是否就使用哪种模式(这3种甚至是另一种模式)达成共识?
  • 是否有一些情况我宁愿使用另一种情况?

1 个答案:

答案 0 :(得分:0)

不要使用吸气剂。这只会使事情复杂化。为什么在import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.HPos; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.layout.GridPane; import javafx.stage.Stage; import javafx.util.Callback; public class Test extends Application { @Override public void start(Stage primaryStage) { GridPane gridPane = new GridPane(); ObservableList<Course> options = FXCollections.observableArrayList( new Course(0, "JavaFX"), new Course(1, "Swing"), new Course(2, "Objective C"), new Course(3, "Swift") ); ComboBox<Course> comboBox = new ComboBox<Course>(options); comboBox.setCellFactory(new Callback<ListView<Course>, ListCell<Course>>() { @Override public ListCell<Course> call(ListView<Course> courses) { return new CourseCell(); } }); comboBox.setButtonCell(new CourseCell()); Button btn = new Button(); btn.setText("Use"); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { Course course = comboBox.getValue(); if (course != null) { System.out.println(course); System.out.println(course.getId()); } } }); GridPane.setHalignment(comboBox, HPos.CENTER); GridPane.setHalignment(btn, HPos.CENTER); gridPane.setAlignment(Pos.CENTER); gridPane.add(comboBox, 0, 0); gridPane.add(btn, 0, 1); Scene scene = new Scene(gridPane, 300, 250); primaryStage.setTitle("Hello World!"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } public class CourseCell extends ListCell<Course> { @Override protected void updateItem(Course item, boolean empty) { super.updateItem(item, empty); if (item != null) { setText(item.getTitle()); } else { setText(null); } } } public class Course { private long id; private String title; public Course(long id, String title) { this.id = id; this.title = title; } public long getId() { return id; } public String getTitle() { return title; } @Override public String toString() { return "Course{" + "id=" + id + ", title=" + title + '}'; } } } 类中包含片段逻辑,对吧?

对于Model vs onCreateView(),我在onCreate()中调用getArguments(),因为在创建视图之前调用此方法。所以,如果你有任何计算或其他东西,那么你可以在这里做。将其保存在全局变量中并将其设置为onCreate()。但是,不是这样做,你可以在onCreateView中完成,对吧?那么差异是什么呢?它有助于保持逻辑分离。在onCreateView中初始化/更新视图,并在onCreateView

中进行预先计算

ListCell implementation