Я пытаюсь обновить свой фрагмент B в альбомном режиме, но массив в методе changeData фрагмента B всегда имеет значение null - PullRequest
0 голосов
/ 17 апреля 2019

Мое приложение имеет два фрагмента в горизонтальном режиме. FragmentA представляет собой список книг, а FragmentB отображает детали выбранных книг в текстовом представлении. После того как выбор сделан в просмотре списка, во FragmentA вызывается метод respond(), который вызывает метод respond() в MainActivity. Затем он проверяет, находится ли он в ландшафтном режиме, проверяя, является ли FragmentB ненулевым и является ли Visible. Но здесь фрагмент никогда не виден, и если я вызываю changeData() метод FagmentB перед проверкой, Arraylist объектов всегда нулевой в методе. Я сделал эту проверку с помощью отладчика. Ниже приведен код:

MainActivity:

public class MainActivity extends AppCompatActivity implements FragmentA.Communicator{


    ArrayList<Book> b = new ArrayList<Book>();
    FragmentManager manager;
    static int flag = 0;
    static String search="great";
    SearchView sv ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sv = (SearchView) findViewById(R.id.searchView);
        sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                flag = 1;
                search = query;
                getBooks();
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                getBooks();
                return false;
            }
        });

        // TODO - add logic to auto-select first book in list to display in details fragment when running in landscape mode
        // TODO - add logic to figure out whether app is displaying in landscape or poortrait mode to accomplish ^^

        getBooks();
        /*
        manager = getSupportFragmentManager();
        f1 = (FragmentA) manager.findFragmentById(R.id.fragment);
        f1.setCommunicator(this);*/

    }


    @Override
    public void respond(int index) {


        /*Bundle args = new Bundle();
        args.putSerializable("book_b_array",(ArrayList<Book>)b);
        args.putInt("someInt",index);*/
        //FragmentManager m1;
        FragmentB f2 = FragmentB.newInstance(b,index);
        final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.fragment2, f2);
        ft.commit();

        //f2 = (FragmentB) manager.findFragmentById(R.id.fragment2);
        /*f2.setArguments(args);
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.fragment2,f2);
        transaction.addToBackStack(null);
        transaction.commit();*/
        f2.changeData(index);



        if(f2!=null && f2.getView()!=null)
        {

            //f2 = FragmentB.newInstance(b,index);

            f2.changeData(index);
           // Log.d("Retro-Title","from if block");


        }
        else
        {
            Bundle bundle = new Bundle();
            bundle.putInt("index", index);
            bundle.putSerializable("bookarray",(ArrayList<Book>)b);
            Fragment newFragment = new FragmentC();
            newFragment.setArguments(bundle);
            FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction();
            transaction2.replace(R.id.fragment, newFragment);
            transaction2.addToBackStack(null);
            transaction2.commit();


        }
    }

    public void afterGetBooks(ArrayList<Book> bks) {
        b.clear();
        for (Book h : bks) {
            b.add(h);
        }
        manager = getSupportFragmentManager();
        Bundle args = new Bundle();
        args.putSerializable("bookarray",(ArrayList<Book>)bks);
        FragmentA f1 = new FragmentA();
        f1.setArguments(args);
        FragmentTransaction transaction1 = manager.beginTransaction();
        transaction1.replace(R.id.fragment,f1);
        transaction1.addToBackStack(null);
        transaction1.commit();
        f1.setCommunicator(this);


    }

    private void getBooks(){

        String url;
        if(flag==0){
        url = "https://kamorris.com/lab/audlib/booksearch.php/";}
        else{
            url = "https://kamorris.com/lab/audlib/booksearch.php?search=" + search;
            flag=0;
        }
        //ArrayList<Book> boo;

        Retrofit retrofit =  new Retrofit.Builder().baseUrl("https://kamorris.com/lab/audlib/booksearch.php/").addConverterFactory(GsonConverterFactory.create()).build();

        Book.API api = retrofit.create(Book.API.class);

        Call<ArrayList<Book>> call = api.getBooks(url);
        call.enqueue(new Callback<ArrayList<Book>>() {
            @Override
            public void onResponse(Call<ArrayList<Book>> call, Response<ArrayList<Book>> response) {

                ArrayList<Book> Books = response.body();
                for(Book h: Books){
                    Log.d("Retro-Title",h.getTitle());
                    //b.add(h);
                }
                afterGetBooks(Books);
            }

            @Override
            public void onFailure(Call<ArrayList<Book>> call, Throwable t) {
                Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_SHORT).show();
            }
        });


    }
}

Фрагмент А:

public class FragmentA extends Fragment implements AdapterView.OnItemClickListener{

    ListView list;
    Communicator communicator;
    ArrayList<Book> book_a;
    ArrayList<String>  book_titles;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view= inflater.inflate(R.layout.fragment_a,container,false);
        savedInstanceState = getArguments();
        if (getArguments() != null) {
            // savedInstanceState = getArguments();
            book_a = (ArrayList<Book>) getArguments().getSerializable("bookarray");
            book_titles = getList(book_a);
            //Log.d("Frag_a:Title",book_a.get(5).getTitle());
            list= (ListView) view.findViewById(R.id.listview);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,book_titles);
            list.setAdapter(adapter);
            list.setOnItemClickListener(this);
        }
        return view;
    }


    public ArrayList<String> getList(ArrayList<Book> book2){

        ArrayList<String> list_titles = new ArrayList<String>();
        int size = book2.size();
        for(int i=0;i<size;i++){
            Book object;
            object = book2.get(i);
            list_titles.add(object.title);
        }


        return list_titles;
    }

    public void setCommunicator(Communicator communicator)
    {
        this.communicator = communicator;
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        communicator.respond(position);

    }

    public interface Communicator{
        public void respond(int index);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if(context instanceof Communicator){
            communicator = (Communicator) context;
        } else {
            throw new RuntimeException(context.toString()+"must implement Communicator");
        }

    }

    @Override
    public void onDetach() {
        super.onDetach();
        communicator = null;
    }
}

FragmentB:

public class FragmentB extends Fragment {

        private int page;
        TextView title_text,author_text;
        ArrayList<Book> book_b;
        boolean fl=false;




        public static  FragmentB newInstance(ArrayList<Book> b,int page){
            FragmentB f2 = new FragmentB();
            Bundle args = new Bundle();
            args.putSerializable("book_b_array",b);
            args.putInt("someInt",page);
            f2.setArguments(args);
            return f2;
        }

        /*
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

        }*/

        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_b,container,false);
            if (getArguments() != null){
                book_b = (ArrayList<Book>) getArguments().getSerializable("book_b_array");
                page = getArguments().getInt("someInt",0);
            } else{ page = 0; fl=true;}
            title_text = (TextView) view.findViewById(R.id.title);
            author_text = (TextView) view.findViewById(R.id.author);

            changeData(page);
            return view;
        }

        @Override
        public void onSaveInstanceState(Bundle args) {
            super.onSaveInstanceState(args);
            args.putSerializable("book_b_array",book_b);
            args.putInt("someInt",page);
        }

        public void changeData(int index)
        {
            if(fl==false) {
                String description = book_b.get(index).getTitle();
                String des = book_b.get(index).getAuthor();
                title_text.setText(description);
                author_text.setText(des);
            }
            else{
                title_text.setText("Select a Book to Display Data");
                author_text.setText("Select Book to display Author");
                fl=false;
            }

        }
    }

Я пробовал разные способы инициализации фрагмента B ... с помощью метода newInstance или его инициализации и отправки значений через связку в основной деятельности. Но, похоже, ничего не работает. Принимая во внимание, что FragmentC и FragmentA, имеющие одинаковые механизмы инициализации, работают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...