我有一个扩展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>
答案 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();
如果您尝试这样做,您会发现它有效。