I am creating a simple FragmentList
App, but for some reason I keep getting the error:
Log.e(TAG, "getParentActivityIntent: bad parentActivityName '" + parentName +
"' in manifest");
In my debugger in Activity.java
This happens in my MainActivity.java
file right after .commit()
:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.myContainer);
if(fragment == null){
fragment = new MyFragment();
fm.beginTransaction()
.add(R.id.myContainer, fragment)
.commit();
}
}
}
MyFragment.java file:
public class MyFragment extends ListFragment {
List<Course> courses = new CourseData().courseArrayList();
public MyFragment(){
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayAdapter arrayAdapter = new ArrayAdapter(getActivity(), R.layout.courselist_item, courses);
setListAdapter(arrayAdapter);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.courselist_item, container, false);
return view;
}
}
ArrayAdapter.java:
public class ArrayAdapter extends android.widget.ArrayAdapter<Course> {
private Context context;
private List<Course> courses;
public ArrayAdapter(@NonNull Context context, int resource, List<Course> courses) {
super(context, resource, courses);
this.context = context;
this.courses = courses;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Course course = courses.get(position);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.courselist_item, null);
ImageView imageView = view.findViewById(R.id.course_image_id);
imageView.setImageResource(course.getImageResourceId(context));
TextView textView = view.findViewById(R.id.course_name);
textView.setText(course.getCourseName());
return view;
}
}
Course.java:
package com.krish.mylistfragmennt;
import android.content.Context;
public class Course {
private String courseName;
private String courseImage;
public Course(String courseName, String courseImage) {
this.courseName = courseName;
this.courseImage = courseImage;
}
public int getImageResourceId(Context context){
return context.getResources().getIdentifier(this.courseImage, "drawable", context.getPackageName());
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCourseImage() {
return courseImage;
}
public void setCourseImage(String courseImage) {
this.courseImage = courseImage;
}
}
CourseData.java:
public class CourseData {
public String[] courseNames = {"First Course", "Second Course", "Third Course"};
public ArrayList<Course> courseArrayList(){
ArrayList<Course> list = new ArrayList<>();
for(int i = 0; i< courseNames.length; i++){
Course course = new Course(courseNames[i], courseNames[i].replace(" ", "").toLowerCase());
list.add(course);
}
return list;
}
}
Manifest file:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.krish.mylistfragmennt">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyListFragmennt">
<activity android:name=".MainActivity"
android:parentActivityName=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
I think the problem is in instantiating the adapter within
onCreate()
callback which is earlier than the fragment can access its activity withgetActivity()
.So, try to transfer that to
onCreateView()
callback.Also use
requireActivity()
as it's safer thangetActivity()