0

Hi does anyone know why i am getting this error in runtime? I am unsure how to resolve it and i am new to this. Please help! I have called the Search class in my MainActivity and my app crashes when i click on the button to open it.

Here is the code used to call the Search class:

search.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, Search.class);
            startActivity(intent);
        }
    });

And here is my Search class:

public class Search extends Fragment implements Filterable {

private FilterViewModel mViewModel;
private TextView fromMauritiusTheNearestTxt;
private TextView largestMagnitudeEarthquakeTxt;
private TextView deepestEarthquakeTxt;
private Button chooseByDateBtn;
private String startdateString, enddateString;
private final LatLng mauritiusLatLng = new LatLng(-20.2005136, 56.5541215);

List<String> alldates;

public List<ItemClass> mRssFeedModels;
private List<ItemClass> datafilteredlist;

public static Search newInstance() {
    return new Search();
}

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

    mViewModel = ViewModelProviders.of(this).get(FilterViewModel.class);

    View root = inflater.inflate(R.layout.activity_search, container, false);

    fromMauritiusTheNearestTxt = root.findViewById(R.id.from_mauritius_the_nearest_txt);
    largestMagnitudeEarthquakeTxt = root.findViewById(R.id.largest_magnitude_earthquake_txt);
    deepestEarthquakeTxt = root.findViewById(R.id.deepest_earthquake_txt);
    chooseByDateBtn = root.findViewById(R.id.choose_by_data_btn);
    alldates = new ArrayList<>();
    ;

    mRssFeedModels = mRssFeedModels;
    setNearestMagnitudeDeepest();

    chooseByDateBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder mydialog1 = new AlertDialog.Builder(getContext());
            LayoutInflater inflater1 = LayoutInflater.from(getContext());
            View myview1 = inflater1.inflate(R.layout.custom_date_range_filter, null);
            mydialog1.setView(myview1);
            final AlertDialog dialog1 = mydialog1.create();
            dialog1.show();
            final TextView startdatetxt = myview1.findViewById(R.id.start_date_txt);
            final TextView enddatetxt = myview1.findViewById(R.id.end_date_txt);


            startdatetxt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final Calendar c = Calendar.getInstance();
                    int mYear = c.get(Calendar.YEAR);
                    final int mMonth = c.get(Calendar.MONTH);
                    int mDay = c.get(Calendar.DAY_OF_MONTH);


                    DatePickerDialog datePickerDialog = new DatePickerDialog(getContext(),
                            new DatePickerDialog.OnDateSetListener() {

                                @Override
                                public void onDateSet(DatePicker view, int year,
                                                      int monthOfYear, int dayOfMonth) {
                                    SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy");
                                    c.set(year, monthOfYear, dayOfMonth);
                                    startdateString = format.format(c.getTime());
                                    startdatetxt.setText(startdateString);
                                }
                            }, mYear, mMonth, mDay);
                    datePickerDialog.show();
                }
            });

            enddatetxt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final Calendar c = Calendar.getInstance();
                    int mYear = c.get(Calendar.YEAR);
                    final int mMonth = c.get(Calendar.MONTH);
                    int mDay = c.get(Calendar.DAY_OF_MONTH);
                    DatePickerDialog datePickerDialog = new DatePickerDialog(getContext(),
                            new DatePickerDialog.OnDateSetListener() {

                                @Override
                                public void onDateSet(DatePicker view, int year,
                                                      int monthOfYear, int dayOfMonth) {
                                    SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy");
                                    c.set(year, monthOfYear, dayOfMonth);
                                    enddateString = format.format(c.getTime());
                                    enddatetxt.setText(enddateString);

                                }
                            }, mYear, mMonth, mDay);
                    datePickerDialog.show();


                }
            });

            Button datefilterbtn = myview1.findViewById(R.id.filterbtn);
            datefilterbtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (TextUtils.isEmpty(startdateString)) {
                        startdatetxt.setError("select date");
                    }
                    if (TextUtils.isEmpty(enddateString)) {
                        enddatetxt.setError("select ");
                    } else {

                        //setNearestMagnitudeDeepest();
                        alldates = getDates(startdateString, enddateString);
                        for (String date : alldates) {
                            System.out.println(date);
                        }
                        getFilter().filter(startdateString);
                        dialog1.dismiss();
                    }
                }
            });
        }
    });
    return root;
}

// mathod used to set
//from Mauritius The Nearest in Textbox
//largest Magnitude Earthquake in Textbox
//deepest Earthquake in Textbox
public void setNearestMagnitudeDeepest() {

    String fromMauritiusTheNearest = "";
    String largestMagnitudeEarthquake = "";
    String largestMagnitudeEarthquakeLocName = "";
    String deepestEarthquakeLocName = "";

    for (int i = 0; i < mRssFeedModels.size(); i++) {

        if (Double.parseDouble(mRssFeedModels.get(i).lat) == findNearestDoubleInList()) {

            fromMauritiusTheNearest = mRssFeedModels.get(i).getLocation();
            System.out.println(mRssFeedModels.get(i).lat + "------------- " + findNearestDoubleInList() + "  " + mRssFeedModels.get(i).getLocation());
        }
    }

    double maxMagnitude = Double.MIN_VALUE;
    for (int i = 0; i < mRssFeedModels.size(); i++) {
        if (Double.parseDouble(mRssFeedModels.get(i).getMagnitude()) > maxMagnitude) {
            maxMagnitude = Double.parseDouble(mRssFeedModels.get(i).getMagnitude());
            largestMagnitudeEarthquakeLocName = mRssFeedModels.get(i).getLocation();
        }
    }

    String maxDepthStr = null;
    int maxDepth = Integer.MIN_VALUE;
    for (int i = 0; i < mRssFeedModels.size(); i++) {
        if (Integer.parseInt(mRssFeedModels.get(i).getDepth().replaceAll("[^0-9]", "")) > maxDepth) {
            maxDepth = Integer.parseInt(mRssFeedModels.get(i).getDepth().replaceAll("[^0-9]", ""));
            maxDepthStr = mRssFeedModels.get(i).getDepth();
            deepestEarthquakeLocName = mRssFeedModels.get(i).getLocation();
        }
    }

    largestMagnitudeEarthquake = String.valueOf(maxMagnitude);

    fromMauritiusTheNearestTxt.setText(fromMauritiusTheNearest);
    largestMagnitudeEarthquakeTxt.setText(largestMagnitudeEarthquake + " in " + largestMagnitudeEarthquakeLocName);
    deepestEarthquakeTxt.setText(maxDepthStr + " in " + deepestEarthquakeLocName);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mViewModel = ViewModelProviders.of(this).get(FilterViewModel.class);
    // TODO: Use the ViewModel
}

//method use to find nearest location from mauritius
private Double findNearestDoubleInList() {
    Double answer = Double.parseDouble(mRssFeedModels.get(0).lat);
    Double current = Double.MAX_VALUE;
    for (int i = 0; i < mRssFeedModels.size(); i++) {
        if (Math.abs(Double.parseDouble(mRssFeedModels.get(i).lat) - mauritiusLatLng.latitude) < current) {
            answer = Double.parseDouble(mRssFeedModels.get(i).lat);
            current = Math.abs(answer - mauritiusLatLng.latitude);
        }
    }
    return answer;
}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {

            String charString = charSequence.toString();
            if (charString.isEmpty()) {
                datafilteredlist = mRssFeedModels;
            } else {
                List<ItemClass> filteredList = new ArrayList<>();
                for (int i = 0; i < alldates.size(); i++) {
                    charString = alldates.get(i);
                    for (ItemClass row : mRssFeedModels) {
                        // name match condition. this might differ depending on your requirement
                        // here we are looking for name or phone number match
                        if (row.getDescription().toLowerCase().contains(charString.toLowerCase())) {
                            filteredList.add(row);
                            System.out.println("matched");
                        }
                    }

                }
                datafilteredlist = filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = datafilteredlist;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults results) {
            mRssFeedModels = (ArrayList<ItemClass>) results.values;
            setNearestMagnitudeDeepest();
            if (fromMauritiusTheNearestTxt.getText().toString().isEmpty()) {
                final android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(getContext());
                builder.setMessage("No record found on this date")
                        .setCancelable(false)
                        .setPositiveButton("Okay", new DialogInterface.OnClickListener() {
                            public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                                mRssFeedModels = mRssFeedModels;
                                setNearestMagnitudeDeepest();
                            }
                        });
                final android.app.AlertDialog alert = builder.create();
                alert.show();
            }
        }
    };
}

private static List<String> getDates(String dateString1, String dateString2) {
    ArrayList<String> dates = new ArrayList<String>();
    SimpleDateFormat df1 = new SimpleDateFormat("dd MMM yyyy");

    Date date1 = null;
    Date date2 = null;

    try {
        date1 = df1.parse(dateString1);
        date2 = df1.parse(dateString2);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    Calendar cal1 = Calendar.getInstance();
    cal1.setTime(date1);
    Calendar cal2 = Calendar.getInstance();
    cal2.setTime(date2);

    while (!cal1.after(cal2)) {
        //Date date=cal1.getTime();
        //dates.add(cal1.getTime());
        dates.add(df1.format(cal1.getTime()));
        cal1.add(Calendar.DATE, 1);
    }
    return dates;
}

}

  • Do you have fragments in your MainActivity? – OLezhko Apr 06 '21 at 21:38
  • no i dont. Do i need too? – programmingbro Apr 06 '21 at 21:40
  • You either need to create a Fragment for your MainActivity to transition between fragment or you need to create an Activity for SearchFragment and to launch that Activity with Intent. Please, read about differences between activities and fragments. – OLezhko Apr 06 '21 at 21:42

2 Answers2

0

Your Search class is a Fragment, you cannot start it with the Intent. Make Search to be Activity or switch between fragments using FragmentManager.

OLezhko
  • 150
  • 3
  • How would i do that? Can you suggest anything – programmingbro Apr 06 '21 at 21:59
  • @programmingbro You either need to create a Fragment for your MainActivity to transition between fragment or you need to create an Activity for SearchFragment and to launch that Activity with Intent. Please, read about differences between activities and fragments – OLezhko Apr 06 '21 at 22:00
0
Intent intent = new Intent(MainActivity.this, Search.class);

The Intent constructor doesn't expect a Fragment class as a second Argument, Here you add Search.class which is a Fragment, but you need to have an Activity instead

Fragments can be loaded in activities using a Transaction, not an intent.

Zain
  • 37,492
  • 7
  • 60
  • 84
  • do you know what i would change the intent from? Im unsure how i would do it. – programmingbro Apr 06 '21 at 21:27
  • You can't use `Intent`, you need to make fragment transaction, as a fragment is just a part of an activity.. check here https://stackoverflow.com/questions/29782808/what-does-fragmentmanager-and-fragmenttransaction-exactly-do – Zain Apr 06 '21 at 21:44