从活动中调用动态片段方法

时间:2014-12-20 04:12:50

标签: android android-fragments

我的活动中通过以下代码动态加载了不同的片段

Fragment fragment = null;
    switch (pos) {
        case 1:
            fragment = new Fragment1();
            break;
        case 2:
            fragment = new Fragment2();
            break;
        default:
            break;
    }
if(fragment != null){
    FragmentManager fm = getFragmentManager();
    fm.beginTransaction().replace(R.id.frg_container, fragment, "frag_"+pos).commit();
    ITEMPOS = pos;
}

现在,如果我想打电话给#34; fragMethod"在我的一个片段中,我该怎么做?我试过下面,但它没有认识到" fragMethod"除非我把课程放在前面。现在我无法对类进行硬编码(Fragment1或Fragment 2)。

FragmentManager mn = getFragmentManager();
Fragment ft = mn.findFragmentByTag("frag_"+ITEMPOS);
ft.fragMethod(scanResult.toString());

更新 感谢Mike M.,我学会了使用界面:)。它是怎样的

活动类:

public class navContainer extends Activity {
    public interface IFragment
    {
        public void fragMethod(String arg);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
      super.onActivityResult(requestCode, resultCode, intent);
      IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
      if (scanResult != null) {
          FragmentManager mn = getFragmentManager();
          Fragment ft = mn.findFragmentByTag("frag_"+ITEMPOS);
          ((IFragment) ft).populateFromBarcode(scanResult.toString());
      }

    }
}

片段类:

public class Fragment1 extends Fragment implements IFragment{
    @Override
    public void populateFromBarcode(String isbn){
        System.out.println(isbn);
    }
}

2 个答案:

答案 0 :(得分:2)

您可以通过两种方式实现这一目标:

<强> 1。使用instanceof:

您可以使用instanceof

检查片段
Fragment ft = mn.findFragmentByTag("frag_" + ITEMPOS);

if (ft instanceof Fragment1) {
    ((Fragment1) ft).fragMethod(scanResult.toString()); 
} else if(ft instanceof Fragment2) {
    ((Fragment2) ft).fragMethod(scanResult.toString()); 
}

<强> 2。使用继承:

在baseClass中定义方法,扩展Fragment然后创建所有片段并扩展此baseClass

代码段:

public class BaseFragment extends Fragment {

    public void fragMethod(String arg) {

    }
}

现在,您可以覆盖所有片段,如:

public class Fragment1 extends BaseFragment {

    @Override
    public void fragMethod(String arg) {
        super.fragMethod(arg);
    }
}

希望它有助于ツ

答案 1 :(得分:1)

使用interface

public interface IFragment
{
    public void fragMethod(String arg);
}

public class Fragment1 implements IFragment {
    public void fragMethod(String arg) {

    }
    ...
}

public class Fragment2 implements IFragment {
    public void fragMethod(String arg) {

    }
    ...     
}
...
...
FragmentManager mn = getFragmentManager();
Fragment ft = mn.findFragmentByTag("frag_"+ITEMPOS);
((IFragment) ft).fragMethod(scanResult.toString());