解决fragment 的findViewByid为空 一个思路

activity  add Fragment一般都是在oncreate里面做 然后   想给fragment 里面的view添加点击事件  用findViewById 会出现空指针

这是因为虽然你把fragment add到Activity里了,但是 Fragment的oncreateView没执行,所以拿不到他的view

 

我的办法是再Fragment里面写个接口回调,然后 在activity里面实现这个接口  加入想要的findViewById

//fragment中定义接口 ,这个View传入fragment的布局View
public interface   AfterOnCreateView{
        void afterOncreateView(View view);
    }
    public  AfterOnCreateView afterOnCreateView;




然后在onCreateView中加入这个接口回调


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
     @Nullable Bundle savedInstanceState) {
    View   view = inflater.inflate(R.layout.fragment_capture, null);
        if(afterOnCreateView!=null){
            afterOnCreateView.afterOncreateView(view);
        }
return  view
}

最后在Activity的oncreate方法中实现这个接口

 captureFragment.afterOnCreateView= new CaptureFragment.AfterOnCreateView(){
            @Override
            public void afterOncreateView(View view) {

//....fragment的View逻辑
}
}

这种方式适合 动态添加fragment布局的情况,这样ui的逻辑就需要写在activity里面,如果一般时候,就推荐在Fragment的onCreateView中写逻辑

好的,我可以为您提供一些思路和代码示例。首先,我们需要使用一个支持树形结构的数据结构来存储我们的数据,例如使用递归的方式来存储每个节点的子节点。这我使用一个 Node 类来表示每个节点: ```java public class Node { private String name; private List<Node> children; // getter/setter methods... } ``` 接下来,我们需要创建一个自定义的 RecyclerView.Adapter 类,用来展示我们的树形结构数据。在这个 Adapter 中,我们需要实现以下几个方法: 1. onCreateViewHolder():创建 ViewHolder 实例。 2. onBindViewHolder():将数据绑定到 ViewHolder 实例上。 3. getItemCount():返回数据项的数量。 4. getItemViewType():返回数据项的类型,用于区分不同的视图类型。 5. getChildren():获取某个节点的子节点列表。 下面是一个示例代码,仅供参考: ```java public class TreeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private List<Node> mNodes; public TreeAdapter(List<Node> nodes) { mNodes = nodes; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // 创建 ViewHolder 实例 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_tree, parent, false); return new TreeViewHolder(view); } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { final Node node = mNodes.get(position); final TreeViewHolder viewHolder = (TreeViewHolder) holder; // 绑定数据到 ViewHolder 上 viewHolder.nameTextView.setText(node.getName()); viewHolder.itemView.setPadding(30 * node.getLevel(), 0, 0, 0); // 点击展开/折叠子节点 viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (node.getChildren().isEmpty()) { return; } boolean expanded = node.isExpanded(); node.setExpanded(!expanded); if (expanded) { notifyItemRangeRemoved(position + 1, node.getChildren().size()); } else { notifyItemRangeInserted(position + 1, node.getChildren().size()); } } }); // 根据节点的展开状态判断是否显示子节点 if (node.isExpanded()) { List<Node> children = node.getChildren(); int count = children.size(); mNodes.addAll(position + 1, children); notifyItemRangeInserted(position + 1, count); } else { int count = node.getChildrenCount(); if (count > 0) { mNodes.subList(position + 1, position + 1 + count).clear(); notifyItemRangeRemoved(position + 1, count); } } } @Override public int getItemCount() { return mNodes.size(); } @Override public int getItemViewType(int position) { return 0; } private List<Node> getChildren(int position) { return mNodes.get(position).getChildren(); } private static class TreeViewHolder extends RecyclerView.ViewHolder { TextView nameTextView; TreeViewHolder(View itemView) { super(itemView); nameTextView = itemView.findViewById(R.id.name); } } } ``` 在这个示例中,我们使用了一个自定义的 ViewHolder 类,用来展示每个节点的名称,同时根据节点的层级来调整左边距的大小。在 onBindViewHolder() 方法中,我们根据节点的展开状态来动态添加或移除子节点,同时更新 RecyclerView 的显示。当用户点击某个节点时,我们需要切换该节点的展开状态,并更新 RecyclerView 的显示。 最后,我们需要在我们的 Activity 或 Fragment 中创建 RecyclerView 实例,并设置我们自定义的 TreeAdapter 为 RecyclerView 的 Adapter: ```java List<Node> nodes = new ArrayList<>(); // 初始化节点数据... TreeAdapter adapter = new TreeAdapter(nodes); RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setAdapter(adapter); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值