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()和工作完美。