【问题标题】:Fragments Inheritance片段继承
【发布时间】:2018-06-02 17:16:32
【问题描述】:

我有 3 个完全一样的片段,每个片段中只有一个字符串变量的区别,即使它们具有相同的布局文件和相同的 onCreateView 方法,我创建了一个包含所有公共方法的超类,但仍然没有子类变量传递给它的超类。它给出了空对象引用错误。

public class QuizFragment extends Fragment {

    private String posType = "xyz";




    @Nullable
    @Override
    public View onCreateView( @NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState ) {
        View view = inflater.inflate(R.layout.fragment_adapter, container, false);



        initContentView("createdDate");

        postCounterWatcher = new PostManager.PostCounterWatcher() {
            @Override
            public void onPostCounterChanged( int newValue ) {
                updateNewPostCounter();
            }
        };


        return view;

    }


    private void initContentView( String sortBy ) {

        newPostsCounterTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick( View v ) {
                refreshPostList(posType);
            }
        });

        postsAdapter = new PostsAdapter((MainActivity) getActivity(), swipeContainer, posType, sortBy);
        postsAdapter.setCallback(new PostsAdapter.Callback() {
            @Override
            public void onItemClick( final Post post, final View view ) {
                PostManager.getInstance(getActivity()).isPostExistSingleValue(post.getId(), new OnObjectExistListener<Post>() {
                    @Override
                    public void onDataChanged( boolean exist ) {
                        if (exist) {
                            openPostDetailsActivity(post, view);
                        } else {
                            showFloatButtonRelatedSnackBar(R.string.error_post_was_removed);
                        }
                    }
                }, posType);
            }

            @Override
            public void onListLoadingFinished() {
                progressBar.setVisibility(View.GONE);
            }

            @Override
            public void onAuthorClick( String authorId, View view ) {
                openProfileActivity(authorId, view);
            }

            @Override
            public void onCanceled( String message ) {
                progressBar.setVisibility(View.GONE);
                Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show();
            }
        });

        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
        recyclerView.setAdapter(postsAdapter);
        postsAdapter.loadFirstPage(posType);
        updateNewPostCounter();

        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled( RecyclerView recyclerView, int dx, int dy ) {
                hideCounterView();
                super.onScrolled(recyclerView, dx, dy);
            }
        });
    }


}

这里只是 posType 是可变的,在其他片段中会有所不同。

【问题讨论】:

  • 你能把这些片段的代码贴出来看看有什么问题
  • 我已添加代码,请查看帖子。

标签: android android-fragments inheritance fragment


【解决方案1】:

使其抽象并为每个片段实现抽象方法以返回不同的值,如下所示:

public abstract class QuizFragment extends Fragment {

public abstract String posType();

@Nullable
@Override
public View onCreateView( @NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState ) {
    View view = inflater.inflate(R.layout.fragment_adapter, container, false);

    initContentView("createdDate");
    postCounterWatcher = new PostManager.PostCounterWatcher() {
        @Override
        public void onPostCounterChanged( int newValue ) {
            updateNewPostCounter();
        }
    };
    return view;
}

private void initContentView( String sortBy ) {

    newPostsCounterTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick( View v ) {
            refreshPostList(posType);
        }
    });

    postsAdapter = new PostsAdapter((MainActivity) getActivity(), swipeContainer, posType, sortBy);
    postsAdapter.setCallback(new PostsAdapter.Callback() {
        @Override
        public void onItemClick( final Post post, final View view ) {
            PostManager.getInstance(getActivity()).isPostExistSingleValue(post.getId(), new OnObjectExistListener<Post>() {
                @Override
                public void onDataChanged( boolean exist ) {
                    if (exist) {
                        openPostDetailsActivity(post, view);
                    } else {
                        showFloatButtonRelatedSnackBar(R.string.error_post_was_removed);
                    }
                }
            }, posType);
        }

        @Override
        public void onListLoadingFinished() {
            progressBar.setVisibility(View.GONE);
        }

        @Override
        public void onAuthorClick( String authorId, View view ) {
            openProfileActivity(authorId, view);
        }

        @Override
        public void onCanceled( String message ) {
            progressBar.setVisibility(View.GONE);
            Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show();
        }
    });

    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
    recyclerView.setAdapter(postsAdapter);
    postsAdapter.loadFirstPage(posType);
    updateNewPostCounter();

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled( RecyclerView recyclerView, int dx, int dy ) {
            hideCounterView();
            super.onScrolled(recyclerView, dx, dy);
        }
    });
}

}

还有你的抽象片段的一些实现:

public class QuizFragmentImpl extends QuizFragment {
    public String posType() {
        return "xyz";
    }
}

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 2022-07-29
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多