【问题标题】:Get reference to Fragment获取对 Fragment 的引用
【发布时间】:2016-06-07 13:21:47
【问题描述】:

问题:很少有代码示例无法帮助我获得对我的 Fragment 的引用。它总是返回 null。

我做了什么:我有一个包含片段的活动。片段进行网络连接。如果它已经完成加载,我在父活动中调用onNetworkingFinished 方法。

onNetworkingFinished 方法内部,我需要获取对片段的引用才能调用片段的方法。

片段肯定不为空,因为它调用了 onNetworkingFinished 方法......

public class MainActivity extends AppCompatActivity implements MaschineFragment.Callbacks{

    private Toolbar toolbar;
    private FloatingActionButton mFab;
    private CoordinatorLayout mCordinatorLayout;
    private MaschineFragment mMaschineFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        toolbar = (Toolbar) findViewById(R.id.toolbar_main);
        setSupportActionBar(toolbar);

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.maschinelistcontainer, new MaschineFragment(), "maschinefragment");

        if(getResources().getBoolean(R.bool.dual_pane)){
            ft.add(R.id.detailreviewcontainer, new ReviewMaschineFragment(), "detailfragment");
        }

        ft.commit();

        mCordinatorLayout = (CoordinatorLayout) findViewById(R.id.maschineCoordinatorLayout);
        mFab = (FloatingActionButton) findViewById(R.id.fab_download_maschinen);
        mFab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

    }

    @Override
    public void onNetworkingFinished(boolean finishedWithError) {
        if(finishedWithError){
            Log.i("Networking", "Daten NUR lokal geladen");
            Snackbar snackbar = Snackbar
                    .make(mCordinatorLayout, getResources().getString(R.string.networking_finished_with_error), Snackbar.LENGTH_LONG);
            snackbar.show();
        } else {
            Log.i("Networking", "Fertig geladen");
            Snackbar snackbar = Snackbar
                    .make(mCordinatorLayout, getResources().getString(R.string.networking_finished_with_error), Snackbar.LENGTH_LONG);
            snackbar.show();
        }

        mMaschineFragment = (MaschineFragment) getSupportFragmentManager().findFragmentById(R.id.maschine_fragment);
        if (mMaschineFragment==null || ! mMaschineFragment.isInLayout()) {
            Log.i("Maschine Fragment", "NULL und nicht im Layout");
        }
        else {
            Log.i("Maschine Fragment", "VORHANDEN");
        }



    }

 (...)


}

【问题讨论】:

  • 你应该使用接口在fragment和activity之间进行通信
  • 我看到你在你使用的每个片段上都附加了一个标签,为什么不试试findFragmentByTag
  • 您应该搜索标签“mashinefragment”而不是 ID。您传入的 ID 是 View ID,而不是 Fragment ID(是的,这很混乱)。
  • @NongthonbamTonthoi:我总是使用接口将数据从片段传递回活动。但反过来我得到了问题:循环继承涉及

标签: android android-fragments android-activity fragmentmanager


【解决方案1】:

您必须将片段引用传递给您的 onNetworkingFinished 方法。

示例:您必须通过 someobject.onNetworkingFinished (boolean finishedWithError,YOURFRAGMENTNAME.this) 从片段中调用 onNetworkingFinished 方法;

在activity中实现onNetworkingFinished方法应该是

 @Override
    public void onNetworkingFinished(boolean finishedWithError,YOURFRAGMENTNAME obj)
 {
  //here you can have fragment access in obj
}

【讨论】:

  • 当我尝试像这样在片段中传递引用时:mCallbacks.onNetworkingFinished(false, this);我得到了问题:错误的第二个参数类型。找到:'com.android.volley.Response.Listener',需要:'com.stack.overflow.MaschineFragment
  • 你能把你的界面贴出来吗?
【解决方案2】:

我认为你误解了findFragmentById()。此方法获取的参数是您之前添加片段的视图的 id,而不是片段的 id。

您这样添加片段:

ft.add(R.id.maschinelistcontainer, new MaschineFragment(), "maschinefragment");

所以你应该试着像这样得到你的片段:

mMaschineFragment = (MaschineFragment) getSupportFragmentManager().findFragmentById(R.id.maschinelistcontainer);

既然你已经指定了tag,你也可以通过tag来获取:

mMaschineFragment = (MaschineFragment) getSupportFragmentManager().findFragmentByTag("maschinefragment");

【讨论】:

  • 感谢您的详细解答。不幸的是,我对您的所有建议都无效。我还能做错什么?
【解决方案3】:

而不是这个
ft.add(R.id.maschinelistcontainer, new MaschineFragment(), "maschinefragment");

试试这个

mMaschineFragment = new MaschineFragment(); ft.add(R.id.maschinelistcontainer, mMaschineFragment, "maschinefragment");

然后通过全局对象mMaschineFragment访问它;

您也可以通过提供调用片段的引用来调用 onNetworkingFinished 函数,例如:

@Override
public void onNetworkingFinished(boolean finishedWithError, MaschineFragment fragment) {
    if(finishedWithError){
        Log.i("Networking", "Daten NUR lokal geladen");
        Snackbar snackbar = Snackbar
                .make(mCordinatorLayout, getResources().getString(R.string.networking_finished_with_error), Snackbar.LENGTH_LONG);
        snackbar.show();
    } else {
        Log.i("Networking", "Fertig geladen");
        Snackbar snackbar = Snackbar
                .make(mCordinatorLayout, getResources().getString(R.string.networking_finished_with_error), Snackbar.LENGTH_LONG);
        snackbar.show();
    }

    mMaschineFragment = fragment;
    if (mMaschineFragment==null || ! mMaschineFragment.isInLayout()) {
        Log.i("Maschine Fragment", "NULL und nicht im Layout");
    }
    else {
        Log.i("Maschine Fragment", "VORHANDEN");
    }



}

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多