Reputation: 581
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
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