我有一个名为MainPage
的活动,它扩展了SherlockFragmentActivity
。
此活动有标签,每个标签显示不同的片段。其中一个片段显示SaleRow
视图,该视图是自定义视图(扩展RelativeLayout
类的类)。我还有SaleDialog
类扩展DialogFragment
。我想要做的是从SaleRow
视图类显示SaleDialog。我试着使用这段代码:
public class SaleRow extends RelativeLayout
{
public SaleRow(Context context)
{
super(context);
...
this.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View view)
{
FragmentManager fm = getFragmentManager(); //compilation error here for getFragmentManager The method getFragmentManager() is undefined for the type new View.OnClickListener()
SaleDialog testDialog = new SaleDialog();
testDialog.setRetainInstance(true);
testDialog.show(fm, "fragment_name");
}
});
我已经找到了解决方案但找不到相关内容。
Thaks
答案 0 :(得分:6)
尝试保留对context
对象的引用,投射它,然后在其上调用getSupportFragmentManager
:
public class SaleRow extends RelativeLayout
{
private Context mContext;
public SaleRow(Context context)
{
super(context);
mContext = context;
this.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View view)
{
try{
FragmentManager fm = ((FragmentActivity) mContext).getSupportFragmentManager();
} catch (ClassCastException e) {
Log.d(TAG, "Can't get fragment manager frmom context");
}
SaleDialog testDialog = new SaleDialog();
testDialog.setRetainInstance(true);
testDialog.show(fm, "fragment_name");
}
});
}
}
答案 1 :(得分:0)
尝试SomeActivity.getFragmentManager();
答案 2 :(得分:0)
在我看来,试图从视图中影响片段管理器的状态是一个坏主意。我更喜欢做的是只允许父Activity
操纵片段管理器。这样,视图就与活动分离,活动可以决定它想要做什么以及它想要做什么。所以我会在Fragment
中监听点击事件,然后通过回调接口将该事件传递给父Activity
:
以下内容包含Fragment
的{{1}}:
SaleRow
然后在// Step 1 - Create callback interface
Callback mCallback;
public interface Callback {
public void showSaleDialog();
}
// Step 2 - Cast the parent Activity to the callback
@Override
public void onAttach(Activity activity) {
try {
mCallback = (Callback) activity;
}
catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement Callback");
}
}
// Step 3 - Set the listener on the SaleRow in the onCreateView() class
saleRow.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// Step 4 - call showSaleDialog() using the callback
mCallback.showSaleDialog();
}
});
:
Activity