从扩展View类的调用中显示FragmmentDialog

时间:2013-05-19 11:23:52

标签: android fragment android-dialogfragment

我有一个名为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

3 个答案:

答案 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