【问题标题】:Fragment Not open inside RecyclerView.Adapter (show error in getFragmentManager() while calling fragment)片段未在 RecyclerView.Adapter 中打开(调用片段时在 getFragmentManager() 中显示错误)
【发布时间】:2017-02-03 07:39:26
【问题描述】:

在这里,我想在 RecycleView 中打开片段,但它显示错误,但是当我打开活动时,它在此处工作。当尝试使用片段管理器打开片段时,Recycler 视图类无法解析到其中的 getFragmentManager() 方法。请提供解决方案

public class AdapterMudra extends RecyclerView.Adapter<AdapterMudra.ReyclerViewHolder> {

private LayoutInflater layoutInflater;
private Context context;
private ArrayList<ItemMudra> items;

public AdapterMudra(Context context, ArrayList<ItemMudra> items) {

    this.layoutInflater = LayoutInflater.from(context);
    this.context = context;
    this.items = items;

}
@Override
public ReyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View item = layoutInflater.inflate(R.layout.item_recycler_view, parent, false);

    return new ReyclerViewHolder(item);
}

@Override
public void onBindViewHolder(final ReyclerViewHolder holder, int position) {
    ItemMudra item = items.get(position);

    holder.image.setImageResource(item.getDrawableMudra());
    holder.appName.setText(item.getNameMudra());
}

@Override
public int getItemCount() {
    return items.size();
}

class ReyclerViewHolder extends RecyclerView.ViewHolder {
    private ImageView image;
    private TextView appName;

    private ReyclerViewHolder(final View v) {
        super(v);

        image = (ImageView) v.findViewById(R.id.image);
        MyName = (TextView) v.findViewById(R.id.my_name);

        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                if(MyName.getText().toString()=="XYZ")
                {







 ***//Fragment Not open here show error////
***
Here I want to call Fragment but its show error in GetFragment Manager***


                Fragment fragment= new XYZ();
                FragmentTransaction transaction = getFragmentManager().beginTransaction();
                transaction.replace(R.id.fragment_container, fragment); 
                transaction.addToBackStack(null);  // this will manage backstack
                transaction.commit();


                }
                if(MyName.getText().toString()=="ABC")
                {



*** //Here Its Work When I open activity inside it*** 

                    Intent intent=new Intent(v.getContext(),ExtraActivityFormTesting.class);
                    context.startActivity(intent);
                }



            }
        });
    }
}
}

【问题讨论】:

    标签: android android-studio android-recyclerview


    【解决方案1】:

    我假设你的 contextActivity 所以你可以做类似的事情

    ((Activity) context).getFragmentManager()
    

    【讨论】:

      【解决方案2】:

      首先确保另一个分片类有必要的实现和构造函数来分片。意思是,XYZ 类可能会阻止您的片段交易,因为它错过了一些必需品。

      例如以下导入

      import android.support.v4.app.Fragment;
      import android.support.v4.app.FragmentActivity;
      import android.support.v4.app.FragmentManager;
      import android.support.v4.app.FragmentTransaction;
      

      现在,如果那是为了。那么首先我要你改革

         Fragment fragment= new XYZ();
      

         XYZ fragment= new XYZ();
      

      第二你的片段管理器构造不好

      改革这个

       Fragment fragment= new XYZ();
                  FragmentTransaction transaction = getFragmentManager().beginTransaction();
      

           XYZ fragment= new XYZ();
                  FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
      

      *并且为了以后的参考,需要从终端带入错误日志

      【讨论】:

      • 在使用 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 发生错误 --> 错误:(74, 59) 错误: 不能查找符号方法 getSupportFragmentManager()
      【解决方案3】:

      当您使用适配器上下文然后访问片段管理器时,您需要转换您的上下文。所以你应该使用这种方式。

      YourParentActivity myActivity = (YourParentActivity)context
      

      现在您可以访问片段管理器的方法,例如,

      myActivity.getSupportFragmentManager();
      

      如果你为特定的标签打开片段,那么你应该使用 getChildSupportFragmentManager() 而不是 getSupportFragmentManager()

      注意:如果您想从适配器类调用片段,那么您应该创建接口并将侦听器传递给您的按钮单击方法并使用该接口实现您的活动。

      祝你好运

      【讨论】:

        【解决方案4】:

        如果您的问题是使用 getFragmentManaget 来实现,请执行以下操作: 创造 片段管理器 fm = getFragmentManager(); 在您的 Fragment 中并将其传递给您的 RecyclerView 并再次将其传递给您的 ViewHolder 并使用它。很简单。

        注意:传递意味着将其作为参数发送给构造函数

        【讨论】:

          【解决方案5】:
          Fragment fragment= new FirstFragment();
          FragmentManager manager = (MainActivityForRecy)context).getSupportFragmentManager();
                              FragmentTransaction transaction = manager.beginTransaction();
                              transaction.replace(R.id.fragment_container, fragment);
                              transaction.addToBackStack(null);  // this will manage backstack
                              transaction.commit();
                              Toast.makeText(context, "you press clicked",Toast.LENGTH_SHORT).show();
          

          【讨论】:

          • 没有必要再次传递 mainActivityForRecy 因为上下文已经传递。唯一需要的是将该上下文转换为活动,然后调用 getSupportFragmentManager
          • 是的,因为需要将其转换为某些活动 ((YourActivityName) context).getSupportFragmentManager(); 才能工作
          • 括号放错了试试 ((MainActivityForRecy)context).getSupportFragmentManager();
          猜你喜欢
          • 2016-03-22
          • 1970-01-01
          • 2021-09-24
          • 1970-01-01
          • 2021-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多