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(),使代码的重复保持在可接受的水平!看起来我缺少了一些基础知识!哎哟!:)@菲比,很高兴我能帮上忙!