使用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
问题是:
答案 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