Проблема с передачей массива из активности во фрагмент - PullRequest
0 голосов
/ 18 января 2020

Я получаю очень странную ошибку, хотя код выглядит нормально (на мой взгляд). Я получаю эту ошибку

java.lang.ArrayIndexOutOfBoundsException: length=1; index=1

Я сохраняю данные из нескольких EditText -й в моем фрагменте, затем помещаю их в array и отправляю в родительские действия, которые затем отправляют их в моей базе данных. Затем после нажатия button, чтобы показать мне фрагмент с текстом из array, приложение вылетает. Вот мой код:

Прочее. java

public class Others extends AppCompatActivity {

    MyAsyncTask1 mt;
    private String numberPickersValues;
    private Button button;
    private NumberPicker numberPicker1;
    private NumberPicker numberPicker2;

    public static String EXTRA_DATA="com.example.schedule.example.EXTRA_DATA";
    /*public static List EXTRA_DATA_arr2= Collections.singletonList("com.example.schedule.example.EXTRA_DATA_arr2");
    public static List EXTRA_DATA_arr3= Collections.singletonList("com.example.schedule.example.EXTRA_DATA_arr3");
    public static List EXTRA_DATA_arr4= Collections.singletonList("com.example.schedule.example.EXTRA_DATA_arr4");
    public static List EXTRA_DATA_arr5= Collections.singletonList("com.example.schedule.example.EXTRA_DATA_arr5");*/

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_others);
        BottomNavigationView bottomNavigationView=findViewById(R.id.bottom_navigation);
        numberPicker1=findViewById(R.id.numberpicker1);
        numberPicker2=findViewById(R.id.numberpicker2);
        numberPicker1.setDescendantFocusability(numberPicker1.FOCUS_BLOCK_DESCENDANTS);
        numberPicker2.setDescendantFocusability(numberPicker2.FOCUS_BLOCK_DESCENDANTS);
        numberPicker1.setMinValue(7);
        numberPicker1.setMaxValue(11);
        String[] set_values_for_NP2=new String[]{"А","Б","В","Г","Д"};
        numberPicker2.setMaxValue(0);
        numberPicker2.setMaxValue(set_values_for_NP2.length-1);
        numberPicker2.setDisplayedValues(set_values_for_NP2);
        bottomNavigationView.setSelectedItemId(R.id.Others);
        button=findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int n1=numberPicker2.getValue();
                numberPickersValues=""+numberPicker1.getValue()+numberPicker2.getDisplayedValues()[n1];
                mt=new MyAsyncTask1();
                mt.execute(numberPickersValues);

            }


        });
        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                switch (menuItem.getItemId()){
                    case R.id.Search:
                        startActivity(new Intent(getApplicationContext()
                                ,Search.class));
                        overridePendingTransition(0,0);
                        return true;
                    case R.id.home:
                        startActivity(new Intent(getApplicationContext()
                                ,MainActivity.class));
                        overridePendingTransition(0,0);
                        return true;
                    case R.id.Others:
                        return true;
                }
                return false;
            }
        });
    }

    private void openOthers2() {
        int n1=numberPicker2.getValue();
        String numberPickersValues=""+numberPicker1.getValue()+numberPicker2.getDisplayedValues()[n1];
        Intent intent=new Intent(getApplicationContext(),Others2.class);
        intent.putExtra(EXTRA_DATA,numberPickersValues);
        startActivity(intent);
    }

    class MyAsyncTask1 extends AsyncTask<String, Void,Void>{


        @Override
        protected Void doInBackground(String... params) {
            Database db = App.getInstance().getDatabase();
            if(db.classDao().doesGroupExist(params[0])){
                Intent i=new Intent(getApplicationContext(),Others2.class);
                i.putExtra(EXTRA_DATA,numberPickersValues);
                Bundle b = new Bundle();
                b.putStringArray("array_for_m", db.classDao().findFromMonday(numberPickersValues));
                i.putExtras(b);
                startActivity(i);
            } else {
                openOthers2();
            }
            return null;
        }
    }

}

Прочее2. java

public class Others2 extends AppCompatActivity {

    private Button button;

    private ViewPager viewPager;

    private Toolbar toolbar;

    private Mon2Fragment mon2Fragment;

    MyAsyncTaskOthers2 mt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_others2);
        button = findViewById(R.id.buttonSave);
        toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_back);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mt = new MyAsyncTaskOthers2();
                mt.execute();

            }
        });
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(getApplicationContext(), Others.class));
            }
        });
        viewPager = findViewById(R.id.viewpager);
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        viewPager.setOffscreenPageLimit(5);
        adapter.AddFragment(new Mon2Fragment(), "Mon");
        adapter.AddFragment(new Tue2Fragment(), "Tue");
        adapter.AddFragment(new Wed2Fragment(), "Wed");
        adapter.AddFragment(new Thu2Fragment(), "Thu");
        adapter.AddFragment(new Fri2Fragment(), "Fri");
        viewPager.setAdapter(adapter);


    }


    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    public String sendData() {
        Intent intent = getIntent();
        return intent.getStringExtra(Others.EXTRA_DATA);
    }

    public String[] sendDataM() {
        Bundle b = this.getIntent().getExtras();
        String[] array=b.getStringArray("array_for_m");
        return array;
        /*Intent intent = getIntent();
        return intent.getStringArrayExtra("my_stringm");*/
    }

    class MyAsyncTaskOthers2 extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {
            Intent intent = getIntent();
            Database db = App.getInstance().getDatabase();
            Fragment page = getSupportFragmentManager().getFragments().get(0);
            Mon2Fragment mon2Fragment = (Mon2Fragment) page;
            if (!db.classDao().doesGroupExist(intent.getStringExtra(Others.EXTRA_DATA))) {
                ClassEntity new_group = new ClassEntity();
                new_group.id_of_a_group = intent.getStringExtra(Others.EXTRA_DATA);
                new_group.monday = mon2Fragment.Text_getter();
                db.classDao().insert(new_group);
            }
          else{
                db.classDao().update(mon2Fragment.Text_getter(), intent.getStringExtra(Others.EXTRA_DATA));
            }
            return null;
        }
    }

}

Mon2Fragment. java

public class Mon2Fragment extends Fragment {
    MyAsyncTaskm2 mt;
    private TextView textView1;
    private TextView textView2;
    private TextView textView3;
    private TextView textView4;
    private TextView textView5;
    private TextView textView6;
    private TextView textView7;
    private TextView textView8;

    private EditText editText1;
    private EditText editText2;
    private EditText editText3;
    private EditText editText4;
    private EditText editText5;
    private EditText editText6;
    private EditText editText7;
    private EditText editText8;

    public Mon2Fragment() {
        // Required empty public constructor
    }


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


        View Fr = inflater.inflate(R.layout.fragment_mon2, container, false);

        textView1 = Fr.findViewById(R.id.text1m);

        textView2 = Fr.findViewById(R.id.text2m);

        textView3 = Fr.findViewById(R.id.text3m);

        textView4 = Fr.findViewById(R.id.text4m);

        textView5 = Fr.findViewById(R.id.text5m);

        textView6 = Fr.findViewById(R.id.text6m);

        textView7 = Fr.findViewById(R.id.text7m);

        textView8 = Fr.findViewById(R.id.text8m);


        editText1 = Fr.findViewById(R.id.edittext1m);

        editText2 = Fr.findViewById(R.id.edittext2m);

        editText3 = Fr.findViewById(R.id.edittext3m);

        editText4 = Fr.findViewById(R.id.edittext4m);

        editText5 = Fr.findViewById(R.id.edittext5m);

        editText6 = Fr.findViewById(R.id.edittext6m);

        editText7 = Fr.findViewById(R.id.edittext7m);

        editText8 = Fr.findViewById(R.id.edittext8m);

        String id = null;
        Activity act = getActivity();
        if (act instanceof Others2) {
            id = ((Others2) act).sendData();
        }
        mt = new MyAsyncTaskm2();
        mt.execute(id);


        TextEditorSet(editText1);
        TextEditorSet(editText2);
        TextEditorSet(editText3);
        TextEditorSet(editText4);
        TextEditorSet(editText5);
        TextEditorSet(editText6);
        TextEditorSet(editText7);
        TextEditorSet(editText8);

        Changer(editText1, textView1);
        Changer(editText2, textView2);
        Changer(editText3, textView3);
        Changer(editText4, textView4);
        Changer(editText5, textView5);
        Changer(editText6, textView6);
        Changer(editText7, textView7);
        Changer(editText8, textView8);


        return Fr;
    }

    private void Changer(final EditText ET, final TextView TV) {
        TV.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {

                TV.setVisibility(View.INVISIBLE);

                ET.setVisibility(View.VISIBLE);

                InputMethodManager imm = (InputMethodManager) Objects.requireNonNull(getActivity()).getSystemService(Context.INPUT_METHOD_SERVICE);

                imm.showSoftInput(ET, 0);

                ET.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                    @Override
                    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

                        if (actionId == EditorInfo.IME_ACTION_DONE) {

                            String value = ET.getText().toString();

                            TV.setText(value);

                            ET.setVisibility(View.INVISIBLE);

                            TV.setVisibility(View.VISIBLE);

                            InputMethodManager imm = (InputMethodManager) Objects.requireNonNull(getActivity()).getSystemService(Context.INPUT_METHOD_SERVICE);

                            imm.hideSoftInputFromWindow(getView().getApplicationWindowToken(), 0);

                            return true;
                        }
                        return false;

                    }

                });
                return false;
            }
        });
    }

    private void TextEditorSet(EditText ET) {

        ET.setTextColor(getResources().getColor(R.color.white));

        ET.setSingleLine();

        ET.setVisibility(View.INVISIBLE);

        ET.setImeOptions(EditorInfo.IME_ACTION_DONE);
    }


    public String[] Text_getter() {
        String[] myStr = new String[8];
        myStr[0] = editText1.getText().toString();
        myStr[1] = editText2.getText().toString();
        myStr[2] = editText3.getText().toString();
        myStr[3] = editText4.getText().toString();
        myStr[4] = editText5.getText().toString();
        myStr[5] = editText6.getText().toString();
        myStr[6] = editText7.getText().toString();
        myStr[7] = editText8.getText().toString();
        return myStr;
    }


    class MyAsyncTaskm2 extends AsyncTask<String, Void, Boolean> {

        @Override
        protected Boolean doInBackground(String... params) {
            Database db = App.getInstance().getDatabase();
            String id = params[0];
            boolean test = false;
            if (db.classDao().doesGroupExist(id)) {
                test = true;
            }
            return test;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            if (result)
                Set();
        }


        public void Set() {
            //String[] arr = {"", "", "", "", "", "", "", ""};
            Activity act = getActivity();
            if (act instanceof Others2) {
                textView1.setText(((Others2) act).sendDataM()[0]);

                textView2.setText(((Others2) act).sendDataM()[1]);

                textView3.setText(((Others2) act).sendDataM()[2]);

                textView4.setText(((Others2) act).sendDataM()[3]);

                textView5.setText(((Others2) act).sendDataM()[4]);

                textView6.setText(((Others2) act).sendDataM()[5]);

                textView7.setText(((Others2) act).sendDataM()[6]);

                textView8.setText(((Others2) act).sendDataM()[7]);
            }

        }

    }
}

Dao и ArrayConverter

@androidx.room.Dao
public interface Dao {

    @Query("SELECT monday FROM  ClassEntity WHERE id_of_a_group = :id")
    String[] findFromMonday(String id);
}

public class ArrayConverter {

    @TypeConverter
    public String[] fromClasses(String subjects){
        String[] array = subjects.split(",");
        return array;
    }

    @TypeConverter
    public String toClasses(String[] subjects){
        String result = "";
            StringBuilder sb = new StringBuilder();
            for (String s : subjects) {
                sb.append(s).append(",");
            }
            result = sb.deleteCharAt(sb.length() - 1).toString();

        return result;
    }

}

Компилятор указывает на метод Set(). Я пробовал разные вещи, но ни одна из них не сработала. Пробовал отладку, которая закончилась неудачно. Надеюсь, вы можете помочь мне. Заранее спасибо

...