【问题标题】:Opening new fragment from RecyclerView button within a fragment从片段中的 RecyclerView 按钮打开新片段
【发布时间】:2020-02-21 20:55:41
【问题描述】:

我有一个片段正在运行,它的部分布局视图加载了 RecyclerView 卡。从这张卡片中,我想启动一个打开全屏布局的新片段。

public class MemoriesFragment extends Fragment {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    MemListFragment fragment = new MemListFragment();
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.placeholder, fragment);
    fragmentTransaction.commit();
}

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

    return view;
}}

这是主要片段。下一个是创建和填充 RecyclerView 的片段

public class MemListFragment extends Fragment  {

ImageButton button1;

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

    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.listRecyclerView);

    ListAdapter listAdapter = new ListAdapter();
    recyclerView.setAdapter(listAdapter);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);

    button1 = view.findViewById(R.id.memory_image);

    return view;

}}

这是 RecyclerView

    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

    private LayoutInflater layoutInflater;
    private List<String> data;
    public ImageButton memory_image;

    public Adapter(MemoriesFragment Context, List<String> data){
       // this.layoutInflater = LayoutInflater.from();
        this.data = data;
   }

@NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = layoutInflater.inflate(R.layout.memory_view,viewGroup,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        // bind the textview with data received

        String title = data.get(i);
        viewHolder.textTitle.setText(title);
        // similarly you can set new image for each card and descriptions
        viewHolder.memoryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AppCompatActivity activity = (AppCompatActivity) view.getContext();
                Fragment MemoryDetails = new MemoryDetails();
                activity.getSupportFragmentManager().beginTransaction().replace(R.id.placeholder, MemoryDetails).addToBackStack(null).commit();
            }
        });
    }
    @Override
    public int getItemCount() {
        return data.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder  {
        // Define UI components here
        TextView textTitle;
        ImageButton memoryButton;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textTitle = itemView.findViewById(R.id.textTitle);
            memoryButton = itemView.findViewById(R.id.memory_image);
        }
    }
}

recylerview 是使用 memory_view.xml 创建的,它只有文本和一个名为 memory_image 的图像按钮。当我运行此代码时,当我单击图像按钮时它会崩溃。

编辑:在下方添加错误日志

2020-02-21 16:50:29.334 19558-19558/com.app.emotivo E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.app.emotivo, PID: 19558
java.lang.IllegalStateException: Could not find method onClick(View) in a parent or ancestor Context for android:onClick attribute defined on view class androidx.appcompat.widget.AppCompatImageButton with id 'memory_image'
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:434)
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:391)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

【问题讨论】:

标签: android android-studio android-fragments android-recyclerview


【解决方案1】:

我不确定它是否有效,但你也可以尝试在记忆片段中使用 supportfragmentmanager ,并将itemView.findViewById(R.id.memory_image)的结果转换为像(ImageButton)itemView.findViewById(R.id.memory_image)这样的ImageButton

【讨论】:

    【解决方案2】:

    片段在适配器内部的显示不是一件好事。 我认为首先使用 Android Jetpack 上的导航 或者使用 RxJava 并将格式表示从适配器传输到片段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2017-12-20
      • 2014-07-28
      相关资源
      最近更新 更多