0

問題:很少的代碼示例並沒有幫助我獲得對片段的引用。它總是返回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"); 
     } 



    } 

(...) 


} 
+0

您應該使用接口片段和活動 –

+1

我看你附上標籤,以每次使用片段之間的通信,爲什麼不嘗試'findFragmentByTag'? –

+1

您應該搜索標記「maschinefragment」而不是ID。你傳入的ID是視圖ID,而不是Fragment ID(是的,它很混亂)。 – DeeV

回答

0

你有你的片段引用傳遞到您的onNetworkingFinished方法。例如:你必須從片段調用onNetworkingFinished方法someobject.onNetworkingFinished(boolean finishedWithError,YOURFRAGMENTNAME.this);

落實活動onNetworkingFinished方法應該是

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

當我嘗試在片段中傳遞引用時,像這樣:mCallbacks.onNetworkingFinished(false,this);我得到的問題:錯誤的第二個參數類型。找到:'com.android.volley.Response.Listener ',必填項:'com.stack.overflow.MaschineFragment – jublikon

+0

您可以發佈您的界面嗎? – dindinii

0

我想你是誤會findFragmentById()。此方法獲得的參數是您之前添加片段的視圖的ID,而不是片段的ID。

您添加您的片段是這樣的:

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

所以你應該儘量讓你的片段是這樣的:

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

既然你已經指定標籤,可以通過標籤得到它太:

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

謝謝您的詳細解答。不幸的是,我收到你的所有建議爲空。我還能做錯什麼? – jublikon

0

取而代之的是
ft.add(R.id.maschinelistcontainer,new MaschineFragment(),「maschinefragment」);

嘗試這種

mMaschineFragment =新MaschineFragment(); ft.add(R.id.maschinelistcontainer,mMaschineFragment,「maschinefragment」);

然後通過全局對象訪問它mMaschineFragment;

也可以撥打通過提供諸如呼叫片段refrence 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"); 
    } 



}