Java 子类片段onCreateView
为了不复制代码,我在程序中决定创建一个Java 子类片段onCreateView,java,android,inheritance,android-fragments,Java,Android,Inheritance,Android Fragments,为了不复制代码,我在程序中决定创建一个BaseFragment(它扩展了Fragment)来保存一些样板数据,并提供暂停/恢复的正确处理,以及newInstance(String myPram)方法。长话短说:BaseFragment的作用是确保保存和恢复状态,即将myPramas恢复为局部变量 接下来我想做的是扩展BaseFragment,以便为两个不同的片段处理两种不同类型的布局(每个片段都需要处理MyParam字段):EditFragment和DetailFragment。 现在问题出现了
BaseFragment
(它扩展了Fragment
)来保存一些样板数据,并提供暂停/恢复的正确处理,以及newInstance(String myPram)
方法。长话短说:BaseFragment的作用是确保保存和恢复状态,即将myPramas恢复为局部变量
接下来我想做的是扩展BaseFragment
,以便为两个不同的片段处理两种不同类型的布局(每个片段都需要处理MyParam字段):EditFragment
和DetailFragment
。
现在问题出现了,因为没有为片段膨胀视图,尽管它们是作为事务添加的(因此它们是透明的!)。
EditFragment
和DetailFragment
都提供了onCreateView()
方法,为了构建自己的视图,我确信它们是正确的,因为我在没有“子类化机制”的情况下创建了它们,当然BaseFragment没有提供onCreateView()
的实现,但没有结果,他们没有画UI
我试着到处放一些super.onCreateView(),但也没有结果……我做错了什么?
下面是基本片段:
public class TimetableBaseFragment extends Fragment {
public static String ID_FIELD = "id";
public static String ID_DESC = "desc";
private String id;
private String desc;
// Constructor to deliver previous position along with itself
public static Fragment newInstance(String id, String desc) {
TimetableBaseFragment f = new TimetableBaseFragment();
Bundle args = new Bundle();
args.putString(ID_FIELD, id);
args.putString(ID_DESC, desc);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
if (args != null) {
id = args.getString(ID_FIELD);
desc = args.getString(ID_DESC);
}
if (savedInstanceState != null) {
id = savedInstanceState.getString(ID_FIELD);
desc = savedInstanceState.getString(ID_DESC);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(ID_FIELD, id);
outState.putString(ID_DESC, desc);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
id = savedInstanceState.getString(ID_FIELD);
desc = savedInstanceState.getString(ID_DESC);
}
}
public String getExamId() {
return id;
}
public String getExamDesc() {
return desc;
}
}
我想补充的是:
public class TimetableEditFragment extends TimetableBaseFragment {
private LinearLayout mLlEditEmpty;
private ArrayList<ScheduleUser> lessons;
private TimetableEditRecyclerViewAdapter mAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lessons = new ArrayList<>();
mAdapter = new TimetableEditRecyclerViewAdapter(getActivity());
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_timetable_edit, container, false);
mLlEditEmpty = (LinearLayout) rootView.findViewById(R.id.LOGIC_empty);
RecyclerView mRvEdit = (RecyclerView) rootView.findViewById(R.id.HEADER_rv);
mRvEdit.setHasFixedSize(true);
mRvEdit.setLayoutManager(new LinearLayoutManager(getActivity()));
mRvEdit.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
mRvEdit.setAdapter(mAdapter);
Toolbar examDesc = (Toolbar) rootView.findViewById(R.id.HEADER_examDesc);
examDesc.setTitle("TOOLBAR Testing");
FloatingActionButton add_fab = (FloatingActionButton) rootView.findViewById(R.id.EDIT_fab);
add_fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addLesson(new ScheduleUser());
}
});
return rootView;
}
public void addLesson(ScheduleUser newItem) {
lessons.add(newItem);
mAdapter.notifyItemInserted(lessons.size() - 1);
}
public class TimetableEditRecyclerViewAdapter extends RecyclerView.Adapter<TimetableEditRecyclerViewAdapter.ViewHolder> {
/* Lots of stuff */
}
}
公共类TimetableEditFragment扩展了TimetableBaseFragment{
私人线路布置图;
私人ArrayList课程;
私人时间表EditRecycleServiceAdapter mAdapter;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
lessons=新建ArrayList();
mAdapter=新的TimeTableEditRecycleServiceAdapter(getActivity());
}
@可空
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
ViewGroup rootView=(ViewGroup)充气器。充气(R.layout.fragment\u timeline\u edit,container,false);
mLlEditEmpty=(LinearLayout)rootView.findViewById(R.id.LOGIC_empty);
RecyclerView mRvEdit=(RecyclerView)rootView.findViewById(R.id.HEADER\u rv);
mRvEdit.setHasFixedSize(true);
setLayoutManager(新的LinearLayoutManager(getActivity());
添加装饰(新的DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL_LIST));
mRvEdit.setAdapter(mAdapter);
工具栏examDesc=(工具栏)rootView.findviewbyd(R.id.HEADER\u examDesc);
examDesc.setTitle(“工具栏测试”);
FloatingActionButton add_fab=(FloatingActionButton)rootView.findViewById(R.id.EDIT_fab);
添加_fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
addLesson(新的ScheduleUser());
}
});
返回rootView;
}
public void addLesson(ScheduleUser newItem){
课程。添加(新项目);
mAdapter.notifyItemInserted(lessons.size()-1);
}
公共类TimeTableEditRecycleServiceAdapter扩展了RecyclerView.Adapter{
/*很多东西*/
}
}
PS:我注意到很可能没有调用子onCreateView(),因为我有一个错误,该错误是由于运行时发生的,但系统没有通知
请帮忙 如何实例化TimetableEditFragment?如果您在父类上调用newInstance(),那么它将为您提供一个TimetableBaseFragment-静态方法不会被Java中的子类覆盖。请尝试注释掉您的
onCreateView
中的所有内容,并查看是否运行。@Egor谢谢,您是对的。我解决了在每个片段中移动newInstance(),使代码的重复保持在可接受的水平!看起来我缺少了一些基础知识!哎哟!:)@菲比,很高兴我能帮上忙!