naja
naja

Reputation: 581

java.lang.IllegalArgumentException: No view found for id for fragment NewLogFragment

In my project I have a navigation drawer that's in the MainActivity.java. Each item in that drawer starts a different fragment that takes up the entire screen space. One of these fragments has buttons that need to launch an Activity (this activity extends MainActivity.java - the rationale behind this was to keep the navigation drawer available). When I press any of the buttons in that one fragment to launch another activity, I get this error

java.lang.RuntimeException: Unable to start activity ComponentInfo{.AddWorkoutActivity}: java.lang.IllegalArgumentException: 
No view found for id 0x7f0a0041 (id/contentFrame) for fragment NewLogFragment{529f3328 #0 id=0x7f0a0041}

Here, NewLogFragment is the fragment that tries to launch a new activity.

Basically, the structure of my project goes like this: MainActivity:java -> contains the NavDrawer and launches a fragment -> This fragment then launches another activity, which results in an error.

Here's my some of my code:

public class MainActivity extends ActionBarActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // rest of the code. Note, DrawerList is the list of items in the drawer.

        DrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                int editedPosition = position + 1;
                Toast.makeText(MainActivity.this, "You selected item " + editedPosition, Toast.LENGTH_SHORT).show();

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

                switch(position){
                    case 0:

                        ft.replace(R.id.contentFrame, new NewLogFragment()).commit();

                        break;

}
                mDrawerLayout.closeDrawer(mDrawerList);
            }
        }); // ... rest of the code

activity_main.xml

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

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/primary"
        app:popupTheme="@style/Theme.AppCompat"
        app:theme="@style/ToolbarTheme" />



    <!-- Main layout -->
    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <FrameLayout
            android:id="@+id/contentFrame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></FrameLayout>


        <!-- Nav drawer -->
        <ListView
            android:id="@android:id/list"
            android:layout_width="305dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="@android:color/white" />
    </android.support.v4.widget.DrawerLayout>    
</LinearLayout>

NewLogFragment.java

public class NewLogFragment extends Fragment {


    private Button bt_button;

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

        View rootView = inflater.inflate(R.layout.newlog_layout, container, false);
        bt_button = (Button) rootView.findViewById(R.id.bt_button);

        bt_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), AddWorkoutActivity.class);
                intent.putExtra("type", 1);
                startActivity(intent);
            }
        });

    return rootView;
}

@Override
    public void onDestroyView() {
        super.onDestroyView();
    }

newlog_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragmentOne">

    <LinearLayout
        android:id="@+id/ll_buttons"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/bt_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/bt_button" />


    </LinearLayout>

</RelativeLayout>

Perhaps I didn't structure my project correctly... but I've looked online and this should work nonetheless. No clue what's wrong. Any suggestions on the best way to structure my project are appreciated as well (in terms of whether to keep it this way or make everything a fragment or an activity). But I'd like to get this problem solved first.

EDIT adding AddWorkoutActivity.java

public class AddWorkoutActivity extends MainActivity implements View.OnClickListener {

    TextView tv_warmupex, tv_mainex, tv_workout_type, tv_cycle, tv_week, tv_one_rm;
    EditText ev_datepicker;
    // more layout stuff

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.addworkout_layout);

        dateFormatter = new SimpleDateFormat("MM-dd-yyyy", Locale.US);

        Intent logFragmentIntent = getIntent();

        workout_type = logFragmentIntent.getStringExtra("workout_type");
        setUpLayout(workout_type);
    }

    // and a bunch of helper methods that do all the calculations

   public void completeWorkout(MenuItem item) {
    if (cb_wu_1.isChecked() && cb_wu_2.isChecked() && cb_wu_3.isChecked() &&
            cb_me_1.isChecked() && cb_me_2.isChecked() && cb_me_3.isChecked()) {
        // add workout to database
        HashMap<String, String> queryValuesMap = new HashMap<String, String>();

        queryValuesMap.put("table", MAIN_E);
        queryValuesMap.put(WEEK, String.valueOf(e_info[1])); // get latest cycle/week for this exercise and +1 to add to the table
        queryValuesMap.put(CYCLE, String.valueOf(e_info[0]));
        queryValuesMap.put(WEIGHT, getWeightString());
        queryValuesMap.put(DATE_CREATED, changeDateFormat(ev_datepicker.getText().toString()));
        queryValuesMap.put(NOTES, "notes");
        queryValuesMap.put(MAIN_EXERCISE, workout_type);

        dbTools.insertExercise(queryValuesMap);

        // Update 1RM table  if a new rep max is achieved during current workout
        if (Double.parseDouble(getWeightString())>oneRepMax){

            HashMap<String, String> queryValuesMapOneRM = new HashMap<String, String>();

            queryValuesMapOneRM.put(MAIN_EXERCISE, workout_type); // get latest cycle/week for this exercise and +1 to add to the table
            queryValuesMapOneRM.put(WEIGHT, getWeightString());
            queryValuesMapOneRM.put(DATE_CREATED, changeDateFormat(ev_datepicker.getText().toString()));
            dbTools.updateExerciseRepMax(queryValuesMapOneRM);

        }

        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    } else {
        /*if not all buttons are clicked, show a toast
          telling user to click all buttons to complete workout
        */
    }
}

}

Upvotes: 1

Views: 1825

Answers (1)

Krish
Krish

Reputation: 3885

The crash occuring because of , you are trying to replace fragment with the id that doesn't contain in the current activity. My suggestion is to change the project structure like , Use One Activity for the NavDrawer and use fragment for each menu.Other wise it will be more complicated . refer the following link, http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/

Upvotes: 2

Related Questions