Botão de um fragmento dentro do acionador do ViewPager onClickListener na referência errada

9

Sinto muito pelo meu título idiota, vou descrevê-lo claramente abaixo:

Situação

Eu tenho um ViewPager com 4 OnBoardingFragment s dentro. Cada Fragment tem exatamente o mesmo layout que foi inflated do mesmo arquivo xml. Esse layout contém um Button que chamei de btnNext e eu configurei o OnClickListener para ele.

Função getItem do meu PagerAdapter

@Override
public Fragment getItem(int position) {
    String title, description, button;
    int resource;
    boolean end = false;
    switch (position) {
        case 0:
            title = context.getString(R.string.on_boarding_title_1);
            description = context.getString(R.string.on_boarding_description_1);
            resource = R.drawable.on_boarding_bg_0;
            button = context.getString(R.string.on_boarding_button_1);
            break;
        case 1:
            title = context.getString(R.string.on_boarding_title_2);
            description = context.getString(R.string.on_boarding_description_2);
            resource = R.drawable.on_boarding_bg_1;
            button = context.getString(R.string.on_boarding_button_2);
            break;
        case 2:
            title = context.getString(R.string.on_boarding_title_3);
            description = context.getString(R.string.on_boarding_description_3);
            resource = R.drawable.on_boarding_bg_2;
            button = context.getString(R.string.on_boarding_button_3);
            break;
        default:
            title = context.getString(R.string.on_boarding_title_4);
            description = context.getString(R.string.on_boarding_description_4);
            resource = R.drawable.on_boarding_bg_3;
            button = context.getString(R.string.on_boarding_button_4);
            end = true;
    }
    return OnBoardingFragment.newInstance(title, description, resource, button, end);
}

@Override
public int getCount() {
    return 4;
}

Funções de OnBoardingFragment :

public static OnBoardingFragment newInstance(String title, String description, int resource,
                                             String button, boolean end) {
    Bundle bundle = new Bundle();
    bundle.putString(EXTRA_TITLE, title);
    bundle.putString(EXTRA_DESCRIPTION, description);
    bundle.putInt(EXTRA_IMAGE, resource);
    bundle.putString(EXTRA_BUTTON, button);
    bundle.putBoolean(EXTRA_END, end);
    OnBoardingFragment fragment = new OnBoardingFragment();
    fragment.setArguments(bundle);
    return fragment;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle bundle = getArguments();
    if (bundle != null) {
        title = bundle.getString(EXTRA_TITLE);
        description = bundle.getString(EXTRA_DESCRIPTION);
        button = bundle.getString(EXTRA_BUTTON);
        end = bundle.getBoolean(EXTRA_END);
        imageResource = bundle.getInt(EXTRA_IMAGE);
        show log ---> Log.e(this.toString() + "/" + end + "/" + title);
    }
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.on_boarding_fragment, container, false);
    TextView tvTitle = (TextView) rootView.findViewById(R.id.tv_title);
    TextView tvDescription = (TextView) rootView.findViewById(R.id.tv_description);
    TextView btnDiscovery = (TextView) rootView.findViewById(R.id.tv_discovery);
    imageView = (ImageView) rootView.findViewById(R.id.iv_image);
    final Button btnNext = (Button) rootView.findViewById(R.id.btn_next);
    if (end) {
        btnDiscovery.setVisibility(View.VISIBLE);
        btnDiscovery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startRegionActivity();
            }
        });
    }
    btnNext.setText(button);
    btnNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            show log ---> Log.e(OnBoardingFragment.this.toString() + "/" + end + "/" + title + "/" + ((Button)v).getText());
            if (end) {
                ((SplashActivity) getActivity()).gotoNextPage();
            } else {
                startLoginActivity();
            }
        }
    });
    tvTitle.setText(title);
    tvDescription.setText(description);
    ImageUtils.loadBitmap(getActivity(), imageResource, imageView, 0.8f, new ImageUtils.LoadBitmapCallback() {
        @Override
        public void onLoadComplete(ImageView imageView) {

        }

        @Override
        public void onLoadFail() {

        }
    });

    return rootView;
}

O problema é

Quando meu aplicativo foi iniciado, mostrei o primeiro Fragment , depois pressionei o método Button e o gatilho onItemClick() , e o método foi referenciado ao último Fragment .

Registre-se quando criar Fragment

OnBoardingFragment{a8ede47 id=0x7f10013b}/false/XIN CHÀO!
OnBoardingFragment{8787674 #0 id=0x7f10013b}/false/BÁN LIỀN TAY, KIẾM TIỀN NGAY
OnBoardingFragment{119f79d #1 id=0x7f10013b}/false/CHAT MIỄN PHÍ
OnBoardingFragment{1ee7412 #2 id=0x7f10013b}/true/NGƯỜI THẬT, HÀNG THẬT

Logar quando onClickListener() foi acionado

OnBoardingFragment{1ee7412 #2 id=0x7f10013b}/true/NGƯỜI THẬT, HÀNG THẬT/Đi chợ ngay nào!

Registre quando o btnNext foi inicializado:

button: android.support.v7.widget.AppCompatButton{17c69e97 VFED..C. ......I. 0,0-0,0 #7f1002c8 app:id/btn_next}
button: android.support.v7.widget.AppCompatButton{31941c VFED..C. ......I. 0,0-0,0 #7f1002c8 app:id/btn_next}
button: android.support.v7.widget.AppCompatButton{30765b87 VFED..C. ......I. 0,0-0,0 #7f1002c8 app:id/btn_next}
button: android.support.v7.widget.AppCompatButton{9cf19e VFED..C. ......I. 0,0-0,0 #7f1002c8 app:id/btn_next}

Pergunta

Por que isso acontece e como resolver?

    
por mr.icetea 11.10.2016 в 10:26
fonte

5 respostas

2

Consulte a amostra no link abaixo para usar o pager de visualização com vários fragmentos: link

    
por Bhagya 19.10.2016 / 06:25
fonte
0

Quando o usuário clica no botão, envie esse evento de volta para a atividade (ou onde você tem uma referência do viewpager). A partir daí, você deve verificar qual fragmento no visualizador está visível (consulte Determinar quando um ViewPager é alterado páginas e Como determinar quando Fragment se torna visível em ViewPager ) e, em seguida, você saberá o que fazer com esse evento.

    
por Yair Kukielka 15.10.2016 / 20:21
fonte
0

você pode usar uma interface de escuta para obter o fragmento e criar um método para obter a posição e enviá-la para onde você tenha declarado o viewpager  1. primeiro crie um objeto anônimo dessa interface naquele fragmento  2. Em segundo lugar, passe esse objeto para PagerAdapter  3. em terceiro lugar você pode usar esse objeto no PagerAdapter e chamar o método que usado na interface com a posição do fragmento  4. você pode incluir o código de manipulação de layout do fragmento no método dentro da innerclasse anônima daquela interface

por favor, tente isso, vai funcionar. Espero que você possa entender o que eu disse.

    
por Jijo 17.10.2016 / 13:15
fonte
0

Use case 3: com break no final e em default , coloque apenas uma única break e nenhuma outra declaração.

    
por Amit Tiwari 19.10.2016 / 12:00
fonte
0

adicione a instrução break no bloco padrão e também passe o argumento end = false no caso de 0,1,2

    
por user2781544 20.10.2016 / 09:25
fonte