3

我有一個簡單佈局的DialogFragment。我想添加一個片段(以及將來用另一個替換片段)到DialogFragment佈局中的FrameLayout。然而,加入新片段的方法失敗,錯誤:沒有找到id的對話框 - DialogFragment +片段

「找到ID 0x7f0b004f com.kennel39.diabeteslive_adtdev無景觀:爲片段Fragment_AlertsManage)ID/frameAlertsContainer {} 41e7cb68」

我已經檢查了我XML,嘗試不同的方法,並閱讀了一些類似的問題在stackoverflow,但我找不到解決方案。

public class DialogManageAlerts extends DialogFragment{ 
static int patient_id; 

public static DialogManageAlerts newInstance(int given_patient_id){ 
    DialogManageAlerts frag = new DialogManageAlerts(); 
    patient_id = given_patient_id; 

    Bundle bund = new Bundle(); 
    bund.putInt("Patient_id", patient_id); 
    frag.setArguments(bund); 
    return frag; 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View mainView = inflater.inflate(R.layout.dialog_alerts_master, container, false);    
    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 

    FragmentManager myFragmentManager = getFragmentManager(); 
    FragmentTransaction myTransact = myFragmentManager.beginTransaction(); 
    Fragment_AlertsManage manageAlertsFragment = new Fragment_AlertsManage(); 
    myTransact.add(R.id.frameAlertsContainer, manageAlertsFragment); 
    myTransact.commit(); 

    return mainView; 
} 

layout.dialog_alerts_master:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="@color/white_regular" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="10dp" 
     android:background="@drawable/lower_border_background_white"> 

    <TextView 
     android:id="@+id/tvManageAlertsTitle" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/manage_alerts_title" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:gravity="center_horizontal" /> 
    </LinearLayout> 
    <FrameLayout 
     android:id="@+id/frameAlertsContainer" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </FrameLayout>  
</LinearLayout> 

而且Fragment_AlertsManage類:

public class Fragment_AlertsManage extends Fragment implements OnClickListener { 
    int patient_id; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View myView = inflater.inflate(R.layout.fragment_alerts_manage, container, false); 

     //Get buttons  
     Button btnAdd = (Button)myView.findViewById(R.id.btnAddAlert); 
     btnAdd.setOnClickListener(this); 
     Button btnBack = (Button)myView.findViewById(R.id.btnBack); 
     btnBack.setOnClickListener(this); 

     //FILL CONTENT 
     populateContent(myView); 

     return myView;  
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()) { 
      case R.id.btnAddAlert: { 
       //Switch fragment 
       FragmentManager myFragmentManager = getFragmentManager(); 
       FragmentTransaction myTransact = myFragmentManager.beginTransaction(); 
       Fragment_AlertsAdd addAlertFragment = new Fragment_AlertsAdd(); 
       myTransact.addToBackStack("Previous"); 
       myTransact.replace(this.getView().getId(), addAlertFragment); 
       myTransact.commit(); 

       break; 
      } 
      case R.id.btnBack: { 
       FragmentManager myFragmentManager = getFragmentManager(); 
       FragmentTransaction myTransact = myFragmentManager.beginTransaction(); 
       myTransact.remove(Fragment_AlertsManage.this); 
       //Launch Home 
       Intent homeIntent = new Intent(this.getActivity(), HomeActivity.class); 
       homeIntent.putExtra("patient_id", patient_id); 
       startActivity(homeIntent); 
       getActivity().finish(); 

       break; 
      } 
     } 
    } 

    public void populateContent(View myView){ 
     try { 
      ArrayList<Alert> alerts = new RetrieveAlerts(patient_id).execute().get(); 

      ListView list = (ListView) myView.findViewById(R.id.reminder_listview); 
      AlertsListAdapter alertsAdapter = new AlertsListAdapter(this.getActivity(), alerts); 
      list.setAdapter(alertsAdapter); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

爲什麼會出現這個錯誤,我能做些什麼來解決呢?

回答

5

的文檔上getFragmentManager()

Return the FragmentManager for interacting with fragments associated with this fragment's activity.

R.id.frameAlertsContainer是在DialogFragment的佈局,而不是活動的佈局,因此它無法找到它。嘗試使用getChildFragmentManager()來代替。不過,我不知道這是否會在onCreateView()方法內工作,因爲視圖尚未與片段相關聯。你可能需要把它放在onStart()或其他東西上。

+1

問題解決了,它在onCreateView裏面工作,所以我不需要改變。謝謝 –

0

我有這個問題,爲解決,我可以在方法OnStart()getFragmentManager()和工作完美。

相關問題