简体   繁体   中英

Can't get fragment to show, no view found for id

I am trying to get a fragment to show that contains an EditText and a button. I am new to using fragments, so I am not sure exactly what the error message I get when trying to create the fragment means.

I have a class that extends Fragment, this is where the EditText and button are created.

public class EditNameFragment extends android.support.v4.app.Fragment {


    EditText editText;
    ImageButton button;

    public EditNameFragment(){

    }


    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.edit_name_dialog, container, false);

        editText = (EditText) view.findViewById(R.id.editTextDialog);
        button = (ImageButton) view.findViewById(R.id.submitNewItemButtonDialog);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //stuff
            }
        });

        return view;

    }

Here is edit_name_dialog.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:id="@+id/edit_name_dialog"
    >

    <EditText
        android:id="@+id/editTextDialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
     />

    <ImageButton
        android:id="@+id/submitNewItemButtonDialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
         />


</LinearLayout>

And here in my main activity (which must extend FragmentActivity because of another part) is where I try to set up my Fragment. I think it has something to do with what id I am referencing. I have seen some people using container classes when using fragments, but I do not understand why this is done.

 FragmentManager fragmentManager = getSupportFragmentManager();
 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

 EditNameFragment fragment = new EditNameFragment();
 fragmentTransaction.add(R.id.edit_name_dialog, fragment, "tag");


 fragmentTransaction.commit();

I get the error message when trying to run the code above

No view found for id 0x7f09002a (com.myapp:id/edit_name_dialog) for fragment EditNameFragment

If anyone could explain what I am missing here/ why people use container classes, that would be great. I know some people add fragments using XML, but I would like to do this only using java.

EDIT

I have added a class that extends FragmentActivity, following the model for a container class

public class EditNameFragmentActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.edit_name_fragment_container);
    }
}

Is the parameter for setContentView supposed to be the layout, or an id? Here is the xml file that defines where the fragment should be

edit_name_fragment_container.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <fragment android:name="com.returnjump.spoilfoil.EditNameFragment"
        android:id="@+id/edit_name_fragment_container"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout="@layout/edit_name_fragment" />

</LinearLayout>

So for the parameter in

fragmentTransaction.add(R.id.edit_name_dialog, fragment, "tag");

this is supposed to reference the id of the fragment, correct?

It still gives me the same error, what am I missing?

There are basically two ways to add a fragment to an activity like the documentation say:

  • "statically": by declaring the fragment inside the activity's layout file.
  • "dynamically": adding the fragment programmatically. Like you tried to do.

Here is the documentation: http://developer.android.com/guide/components/fragments.html

If you wish to add it dynamically, here is the documentation part that you want to read:

At any time while your activity is running, you can add fragments to your activity layout. You simply need to specify a ViewGroup in which to place the fragment. To make fragment transactions in your activity (such as add, remove, or replace a fragment), you must use APIs from FragmentTransaction. You can get an instance of FragmentTransaction from your Activity like this:

FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

You can then add a fragment using the add() method, specifying the fragment to add and the view in which to insert it. For example:

ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();

The first argument passed to add() is the ViewGroup in which the fragment should be placed, specified by resource ID, and the second parameter is the fragment to add. Once you've made your changes with FragmentTransaction, you must call commit() for the changes to take effect.

And about why to use dynamic fragments instead of static fragments, it has been made for interactive UI allowing you to simply handle different fragments into one activity as you please.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM