3

シンプルなレイアウトの DialogFragment があります。DialogFragment のレイアウト内にある FrameLayout にフラグメントを追加したい (そして将来、このフラグメントを別のフラグメントに置き換えたい)。ただし、新しいフラグメントを追加する方法は次のエラーで失敗します。

「フラグメント Fragment_AlertsManage {41e7cb68} の ID 0x7f0b004f com.kennel39.diabeteslive_adtdev:id/frameAlertsContainer) のビューが見つかりません」

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();
        }
    }

このエラーが発生するのはなぜですか? また、解決するにはどうすればよいですか?

4

2 に答える 2

6

ドキュメントgetFragmentManager():

このフラグメントのアクティビティに関連付けられたフラグメントと対話するための FragmentManager を返します。

R.id.frameAlertsContainer は、アクティビティのレイアウトではなく、DialogFragment のレイアウトにあるため、見つけることができません。代わりに getChildFragmentManager() を使用してみてください。ただし、ビューがまだフラグメントに関連付けられていないため、これが onCreateView() メソッド内で機能するかどうかはわかりません。onStart() などに入れる必要があるかもしれません。

于 2014-04-15T17:53:11.510 に答える
0

私はこの問題を解決するために、メソッド OnStart() で getFragmentManager() を使用して完璧に動作させることができました。

于 2014-07-01T17:54:04.040 に答える