使用AppCompatActivity时,适配器中的getSupportFragmentManager()未定义

时间:2016-08-05 02:56:34

标签: android android-layout android-fragments android-arrayadapter android-fragmentactivity

我有一个扩展AppCompatActivity的活动(MainActivity),因为我在我的应用程序中使用了一些材质设计元素。

然后我有一个带有几个字段和一个按钮的数组适配器。此适配器具有单独的视图,并注入到我的MainActivity布局中。

当我单击适配器视图上的按钮时,我想打开一个显示一堆文本的新片段,但是,我似乎无法做到这一点,我认为这是因为我没有扩展FragmentActivity在我的MainActivity?我在另一篇文章中读到我应该能够扩展AppCompatActivity并且仍然能够引用片段管理器...这是我打开片段的代码:

在我的自定义数组适配器中,按钮的onClick():

holder.desc.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
      JobDescFragment fragment= new JobDescFragment();
      FragmentTransaction transaction =      getSupportFragmentManager().beginTransaction();
      transaction.replace(R.id.fragment_container, fragment);
      transaction.addToBackStack(null);  
      transaction.commit();
  }
});

我得到的错误是它无法解析getSupportFragmentManager()。我究竟做错了什么?

我在我的适配器中导入android.support.v4.app.Fragment和.FragmentManager。

提前感谢您的帮助!

编辑:

<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <com.lorentzos.flingswipe.SwipeFlingAdapterView
        android:id="@+id/frame"
        android:background="@color/laborswipe_lightgray"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:context=".MainActivity"
        android:layout_gravity="top"   />

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</merge>

9 个答案:

答案 0 :(得分:18)

你可以试试这个

FragmentTransaction ft = ((AppCompatActivity) mContext).getSupportFragmentManager()
                        .beginTransaction();

答案 1 :(得分:5)

kotlin 中,它就像这样。我已经尝试过它并且完美地工作

val dialog = IntervAddFragment()//The fragment that u want to open for example
       val ft = (context as AppCompatActivity).supportFragmentManager.beginTransaction()
        dialog.show(ft, ContentValues.TAG)

答案 2 :(得分:4)

嗨,这很简单,只需传递YourParent Activity的引用即可 只需在您的Adapter类中使用如下所示的代码段打开片段

Fragment fragment = new YourFragment();
FragmentManager fm = ((MainActivity) mContext).getSupportFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.add(R.id.frame_container, fragment);
                ft.commit();

答案 3 :(得分:1)

在适配器使用中

appCompatActivity对象而不是上下文

它会起作用

答案 4 :(得分:0)

在适配器中传递上下文并使用

context.getSupportFragmentManager().beginTransaction();

答案 5 :(得分:0)

避免不需要的代码

 public class AdapterRecyclerViewDoc extends RecyclerView.Adapter<AdapterRecyclerViewDoc.ShareDocViewHolder> {
        ArrayList<ModelDoc> arrayList;

        AppCompatActivity appCompatActivity;

        public AdapterRecyclerViewDoc(ArrayList<ModelDoc> arrayList, AppCompatActivity appCompatActivity) {
            this.arrayList=arrayList;
            this.appCompatActivity=appCompatActivity;
        }

        @Override
        public ShareDocViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            View v = LayoutInflater.from(parent.getContext()).inflate
                    (R.layout.recyclerview_item_doc, parent, false);
            ShareDocViewHolder eventViewHolder = new ShareDocViewHolder(v);
            this.appCompatActivity.getSupportFragmentManager();
             return eventViewHolder;
        }

答案 6 :(得分:0)

为了使代码更加灵活和独立逻辑,您应该了解组件的职责。很明显,你的适配器不应该知道片段和什么是Activity的基类。那你该怎么办?

在您的活动中,您应该在适配器内设置一个项目点击事件的监听器:

public class YourActivity extends AppCompatActivity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_your);
          //... some findViewById, etc.
          YourAdapter adapter = new YourAdapter(this, data, new OnDetailsRequestListener(){
               public void onDetailsRequested(int itemId){
                    DetailsFragment fragment = DetailsFragment.newInstance(itemId);
                    getSupportFragmentManager().beginTransaction()
                         .replace(R.id.fragment_container, fragment)
                         .addToBackStack(null)
                         .commit();
               });
            //... recyclerView.setAdapter ... etc.

     }

 public interface onDetailsRequestListener{
      void onDetailsRequestLister(int itemId);//here could be whatever you want, itemId, details, whatever...
 }
}

在你的适配器中你会得到:

//...
    public AdapterConstructor(Context context, ArrayList data, YourActivity.OnDetailsRequestListener detailsRequestListener) {
       this.data = data;
       this.context = context;
       this.detailsRequestListener = detailsRequestListener;
       //...
    }
    //Inside bindView
    holder.desc.setTag(position);
    holder.desc.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
          int position = (int)view.getTag();
          int itemId = data.get(position).getId();
          detailsRequestListener.onDetailsRequested(itemId);
       }
    });

答案 7 :(得分:0)

来自你的班级

  YourAdapter=new YourAdapter(context, list, YourClass.this.getSupportFragmentManager)

适配器

  public Adapter(context, list, FragmentManager manager){ 
  this.manager=manager;

动作

 FragmentTransaction ft = fragmentcontext.beginTransaction();
            SlideshowDialogFragment newFragment = SlideshowDialogFragment.newInstance();
            newFragment.setArguments(bundle);
            newFragment.show(ft, "slideshow");

答案 8 :(得分:-2)

FragmentTransaction trans =((FragmentActivity)context).getSupportFragmentManager()
                        .beginTransaction();

如果您尝试这样做,您会发现它有效。