J'utilise une mise en page d'onglets dans mon application et j'ai un bouton qui démarre une minuterie, puis l'arrête. Le problème est dans mon espace réservé, je ne peux trouver des vues de texte que dans ma méthode onCreateView() en utilisant root.FindViewById.

Bien sûr, je ne peux pas accéder à root en dehors de la méthode onCreateView(). Existe-t-il un moyen de contourner ce problème ? Voici mon code de fragment d'espace réservé :

public class PlaceholderFragment extends Fragment {

    private static final String ARG_SECTION_NUMBER = "section_number";

    private PageViewModel pageViewModel;
    Context thiscontext;

    TextView timerView;
    long startTime = 0;

    Handler timerHandler = new Handler();
    Runnable timerRunnable = new Runnable() {

        @SuppressLint("DefaultLocale")
        @Override
        public void run() {

            long millis = System.currentTimeMillis() - startTime;
            int seconds = (int) (millis / 1000);
            int minutes = seconds / 60;
            seconds = seconds % 60;

            timerView.setText(String.format("%d:%02d", minutes, seconds));

            timerHandler.postDelayed(this,500);
        }
    };
    public static PlaceholderFragment newInstance(int index) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle bundle = new Bundle();
        bundle.putInt(ARG_SECTION_NUMBER, index);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        pageViewModel = ViewModelProviders.of(this).get(PageViewModel.class);
        int index = 1;
        if (getArguments() != null) {
            index = getArguments().getInt(ARG_SECTION_NUMBER);
        }
        pageViewModel.setIndex(index);


    }

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

        View root = inflater.inflate(R.layout.fragment_main, container, false);
        thiscontext = container.getContext();

        final TextView textView = root.findViewById(R.id.section_label);
        pageViewModel.getText().observe(this, new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                textView.setText(s);
            }
        });

        timerView = (TextView) root.findViewById(R.id.hoursConnected);

        Button b = root.findViewById(R.id.b);
        b.setText("start");
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Button b = (Button) v;

                if(b.getText().equals("stop")){
                    timerHandler.removeCallbacks(timerRunnable);
                    b.setText("start");
                }else{
                    startTime = System.currentTimeMillis();
                    timerHandler.postDelayed(timerRunnable, 0);
                    b.setText("stop");
                }
            }
        });

        return root;
    }

----------------// HERE IS THE PROBLEM //----------------------------------------------------------------

    @Override
    public void onPause(){
        super.onPause();

        timerHandler.removeCallbacks(timerRunnable);
        Button b = findViewById(R.id.b); ----------------// THIS IS NOT WORKING //----------------
        b.setText("start");
    }

0
slahslah90 9 févr. 2020 à 21:56

1 réponse

Meilleure réponse

Ce que nous faisons, c'est définir les propriétés de la classe pour stocker les références de vue, puis les enregistrer dans la méthode onCreate. De cette façon, vous les avez disponibles tout au long de la classe.

Par exemple si vous souhaitez avoir accès à R.id.b :

public class PlaceholderFragment extends Fragment {
    Button button;


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

            ...

            button = root.findViewById(R.id.b);
            ...
        }

        @Override
        public void onPause(){
            super.onPause();

            timerHandler.removeCallbacks(timerRunnable);
            button.setText("start");
        }
}

Au cas où cette vue serait réutilisée, vous devriez jeter un œil au fonctionnement de ViewHolder. Dans les deux cas, il est recommandé d'enregistrer la référence lorsque la vue est gonflée.

0
jeprubio 9 févr. 2020 à 19:27