Фрагмент Android с ViewPager oncreateView, вызванным неправильным фрагментом - PullRequest
0 голосов
/ 16 октября 2018

У меня есть основное действие, которое показывает 3 фрагмента внутри View Pagers с вкладками.

mainActivity.java

public class mainActivity extends AppCompatActivity {

globalVariableActivity variable = new globalVariableActivity();

private APIService mAPIService;
private TextView mResponseTv;

private RecyclerView recyclerView;

private Token token = new Token("","","");

private Gson gson = new Gson();

private Context context=mainActivity.this;

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //check if token is still active

    String current_token=token.getToken(context);

    MyFirebaseInstanceIDService Fcm= new MyFirebaseInstanceIDService();
    Fcm.onTokenRefresh(context,current_token);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(false);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new BeritaFragment(), "Berita");
    adapter.addFragment(new DiskusiFragment(), "Diskusi");
    adapter.addFragment(new PesanFragment(), "Pesan");
    viewPager.setAdapter(adapter);
}


class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {

        //Toast.makeText(context,"Item " + position + " shown.", Toast.LENGTH_SHORT).show();
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Toast.makeText(context,"Position : " + position + " Title : "+ mFragmentTitleList.get(position) + " shown.", Toast.LENGTH_SHORT).show();
        return mFragmentTitleList.get(position);
    }
}

interface LyfecycleListener {
    void onCreatedView();
}

вот первый фрагмент кода

beritaFragment.java

public class BeritaFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER

private APIService mAPIService = APIUtils.getAPIService();;
private Gson gson = new Gson();

private TextView createdAtText;
private TextView judulText;
private ImageView imageView;
private RecyclerView mRecyclerView;
private ListAdapter mListadapter;



private ArrayList<DataBerita> list_berita= new ArrayList<>();

private OnFragmentInteractionListener mListener;

public BeritaFragment() {
}

// TODO: Rename and change types and number of parameters
public static BeritaFragment newInstance(String param1, String param2) {
    BeritaFragment fragment = new BeritaFragment();

    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getBeritaTask getBerita= new getBeritaTask();
    try {
        Log.d("berita :", "On create 1");
        getBerita.execute().get(10000, TimeUnit.MILLISECONDS);

        Log.d("berita :", "On create 2");
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (TimeoutException e) {
        e.printStackTrace();
    }

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_berita, container, false);

    Log.d("Berita","On create view");

    Toast.makeText(getActivity() ,"Berita Fragment onCreateView", Toast.LENGTH_SHORT).show();


    ArrayList<DataBerita> data_berita;

    mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
    judulText = (TextView)view.findViewById(R.id.summary_judul);
    createdAtText = (TextView)view.findViewById(R.id.created_at);
    //imageView = (ImageView)view.findViewById(R.id.gambar);

    final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    mRecyclerView.setLayoutManager(layoutManager);

    //data_berita=getBeritaList();

    Log.d("Berita","1");

    Log.d("Berita List : ", list_berita.toString());

    Log.d("Berita","3");
    mListadapter = new ListAdapter(list_berita);
    mRecyclerView.setAdapter(mListadapter);

    //Log.d("Berita view :", view.toString());
    return view;

}

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
}

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}


public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder>
{
    private ArrayList<DataBerita> dataList;

    public ListAdapter(ArrayList<DataBerita> data)
    {
        this.dataList = data;
    }

    public class ViewHolder extends RecyclerView.ViewHolder
    {
        TextView judulText;
        TextView waktuText;
        ImageView gambarView;

        public ViewHolder(View itemView)
        {
            super(itemView);
            this.judulText = (TextView) itemView.findViewById(R.id.summary_judul);
            this.waktuText = (TextView) itemView.findViewById(R.id.created_at);
            //this.gambarView = (ImageView) itemView.findViewById(R.id.gambar);
        }
    }

    @Override
    public ListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.berita_list_layout, parent, false);

        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ListAdapter.ViewHolder holder, final int position)
    {
        Uri ImageURI=Uri.parse(dataList.get(position).getGambar_utama());
        holder.judulText.setText(dataList.get(position).getSummary_judul());
        holder.waktuText.setText(dataList.get(position).getCreated_at());
        //holder.gambarView.setImageURI(ImageURI);

        holder.itemView.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Toast.makeText(getActivity(), "Item " + position + " is clicked.", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public int getItemCount()
    {
        return dataList.size();
    }
}


private class getBeritaTask extends AsyncTask<Void, Void, Void> {

    protected void onPreExecute() {
        Log.d("Berita","2.1");
    }

    protected Void doInBackground(Void... voids) {

        mAPIService.getBeritaList().enqueue(new Callback<Berita>() {
            @Override
            public void onResponse(Call<Berita> call, Response<Berita> response) {

                list_berita = new ArrayList<>();

                DataBerita data_berita = new DataBerita("","","","");

                String id_berita;
                String judul;
                String gambar_utama;
                String created_at;

                Log.d("Berita","2.2");
                if(response.isSuccessful()) {

                    Berita body = gson.fromJson(response.body().toString(),Berita.class);

                    for (int i = 0; i < body.getList_berita().getData().size(); i ++) {

                        id_berita=body.getList_berita().getData().get(i).getId_berita();
                        judul=body.getList_berita().getData().get(i).getSummary_judul();
                        gambar_utama=body.getList_berita().getData().get(i).getGambar_utama();
                        created_at=body.getList_berita().getData().get(i).getCreated_at();

                        data_berita = new DataBerita(id_berita,judul,gambar_utama,created_at);
                        list_berita.add(data_berita);
                    }
                    Log.d("Berita List",list_berita.toString());

                }else{
                    Log.d("Berita", "Fail");
                }

            }

            @Override
            public void onFailure(Call<Berita> call, Throwable t) {
                Log.d("Berita Fail", t.getMessage());
            }
        });

        return null;
    }
}

вот 2-й и 3-й фрагменты (эти 2 фрагмента в основном все еще пусты, с кодом для тоста и журналом только на данный момент)

DiskusiFragment.java

public class DiskusiFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;

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

// TODO: Rename and change types and number of parameters
public static DiskusiFragment newInstance(String param1, String param2) {
    DiskusiFragment fragment = new DiskusiFragment();

    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

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

    Toast.makeText(getActivity() ,"Diskusi Fragment onCreateView", Toast.LENGTH_SHORT).show();

    return inflater.inflate(R.layout.fragment_diskusi, container, false);
}

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}
}

вот в чем проблема,

фрагмент Функция onCreateView вызывается в / в неправильный фрагмент.

когда я запускаю приложение, вот что произошло:

  1. Позиция элемента 0, 1 и 2 называется
  2. Вызывается 1-й фрагмент в представлении создания, а второй - в представлении создания.немедленно

что будет дальше, зависит от того, что я делаю:

при переходе с 1-го фрагмента => 2-й фрагмент, 3-й фрагмент в представлении создания называется

когда я изменяю с 1-го фрагмента => 3-й фрагмент, 3-й фрагмент при создании представленияlled

, когда я переключаюсь со 2-го фрагмента => 1-го фрагмента, при создании представления не открывается ни один фрагмент, называемый

, когда я переключаюсь со 2-го фрагмента => 3-го фрагмента, при создании представления, называемого

, нет фрагмента

когда я переключаюсь с 3-го фрагмента => 2-й фрагмент, при создании представления не вызывается фрагмент (или иногда вызывается 1-й фрагмент при создании представления)

при переходе с 3-го фрагмента => 1-й фрагмент, 1-й фрагментв представлении создания, называемом

, должно ли это произойти (в отношении функции onCreateView для неправильного фрагмента)?

, если нет, то где я неправильно написал код?

Большое спасибо

* РЕДАКТИРОВАТЬ: это нормальное поведение, я действительно плохо знаком с Android.Очень извините за неудобства, ребята

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

FragmentPagerAdapter сохраняет дополнительные фрагменты, кроме показанного, в возобновленном состоянии.

Если вы хотите инициализировать материал во фрагменте, вы должны сделать это при вызове OnCreate.

Все, что связано с пользовательским интерфейсом, загружено правильно, должно происходить на onViewCreated

Кроме того, если вы хотите получить больше информации о том, как обрабатывать фрагменты внутри ViewPager

@ Shreyas Shetty ответил очень хорошо на этой теме

0 голосов
/ 16 октября 2018

Что вы подразумеваете под «неправильным» фрагментом?Вид пейджер создает следующий фрагмент до перехода к нему, чтобы сделать переход плавным и быстрым.И когда фрагмент создается, его методы жизненного цикла вызываются соответствующим образом, в этом нет ничего плохого.Если вы хотите выполнить какое-либо действие, когда пользователь перемещается к определенному фрагменту в вашем пейджере, вы можете использовать OnPageChangeListener.

...