2013-02-18 50 views
0

我的佈局中有2個選項卡。我無法在非活動選項卡中的EditText中輸入輸入值。因此,讓我們說選擇保持registerLoginFragment的選項卡。以下代碼返回期望值。從非活動標籤中獲取輸入

EditText editTextEmail = (EditText)registerLoginFragment.getView().findViewById(R.id.editTextEmail); 

但是正從第二標籤值是不活動的失敗,不活動標籤的NPE因爲getView()返回null。所以下面是失敗:

EditText EditTextFirstName = (EditText)registerPersonalFragment.getView().findViewById(R.id.EditTextFirstName); 

所以我需要從第一個選項卡上的按鈕被點擊時從兩個選項卡獲得輸入。這兩個選項卡都會被訪問並輸入值。

多一點代碼:

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    if(tab.getTag().toString().equals("LOGIN_TAB")){ 

     if(registerLoginFragment == null){ 
      registerLoginFragment = Fragment.instantiate(this, RegisterLoginFragment.class.getName()); 
      ft.add(R.id.linearLayoutRegister, (Fragment)registerLoginFragment); 
     } 
     else{ 
      ft.attach((Fragment)registerLoginFragment); 
     } 


     currentFragment = registerLoginFragment; 
    } 
    else if(tab.getTag().toString().equals("PERSONAL_TAB")){ 
     if(registerPersonalFragment == null){ 
      registerPersonalFragment = Fragment.instantiate(this, RegisterPersonalFragment.class.getName()); 
      ft.add(R.id.linearLayoutRegister, (Fragment)registerPersonalFragment); 
     } 
     else{ 
      ft.attach((Fragment)registerPersonalFragment); 
     } 

     currentFragment = registerPersonalFragment; 
    } 

} 

所以,很顯然,這不是從非激活標籤中取得值以正確的方式,但我沒有找到正確的方法。

我想我可以做到這一點:Get text from edit text fields that are in multiple tabs

但有一個更「優雅」的方式?

感謝 Velja

回答

0

我找到了實現這一任務,有趣的方式。而不是分離和附加(或使用FragmentTransaction.replace)我顯示並隱藏我的片段選項卡操作。請注意,使用GONE值並非INVISIBLE非常重要,因爲GONE不會在視圖中使用任何空格:http://developer.android.com/reference/android/view/View.html#GONE 我會留下問題以瞭解是否還有更多「正確」方法? 如此重構的代碼如下所示:

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    if(tab.getTag().toString().equals("LOGIN_TAB")){ 

     if(registerLoginFragment == null){ 
      registerLoginFragment = Fragment.instantiate(this, RegisterLoginFragment.class.getName()); 
      ft.add(R.id.linearLayoutRegister, (Fragment)registerLoginFragment); 
     } 
     else{ 
      //ft.attach((Fragment)registerLoginFragment); 
      registerLoginFragment.getView().setVisibility(View.VISIBLE); 
     } 


     currentFragment = registerLoginFragment; 
    } 
    else if(tab.getTag().toString().equals("PERSONAL_TAB")){ 
     if(registerPersonalFragment == null){ 
      registerPersonalFragment = Fragment.instantiate(this, RegisterPersonalFragment.class.getName()); 
      ft.add(R.id.linearLayoutRegister, (Fragment)registerPersonalFragment); 
     } 
     else{ 
      //ft.attach((Fragment)registerPersonalFragment); 
      registerPersonalFragment.getView().setVisibility(View.VISIBLE); 
     } 

     currentFragment = registerPersonalFragment; 
    } 

} 

@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    if(currentFragment != null){ 
     //ft.detach((Fragment)currentFragment); 
     currentFragment.getView().setVisibility(View.GONE); 
    } 

}