java - 如何在片段中使用 findViewById?

标签 java android-studio android-fragments

我是片段新手,我无法在片段中定义文本按钮等,我不知道为什么,我尝试过 getView() 等...但没有任何效果,我也不知道 onCreateView 中应该包含哪些内容或者应该继续什么创建一切看起来真的很困惑。如果有人可以帮助我,那就意味着很多,我已经尝试了从 youtube 到 stackoverflow,再到 google 的所有内容!

我什至不知道我是否正确使用了 mContext,即 onAttach 方法。

P.S 我将所有内容从 Activity 转移到 Fragment,因此我可能会搞乱事情的去向,因为我以前没有见过 OnCreate View。

import android.content.Context;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;

import android.content.Intent;
import android.graphics.Color;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.MenuItem;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.MediaController;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.material.bottomnavigation.BottomNavigationView;

import java.util.ArrayList;
import java.util.Locale;
import java.util.Random;


public class HomeFragment extends Fragment implements View.OnClickListener {

    private Context mContext;

    public String user_answer = "";
    public String name= "";
    public String current_answer = "";
    public int score = 0;
    public int current_question_num = 0;

    public HomeFragment() {

    }

    Random random = new Random();

    Button btnOption1, btnOption2, btnOption3, btnOption4;
    Button btnSubmit;
    TextView txtQuestion, txtScore;

    public MediaPlayer right, wrong;

    Questions questions = new Questions();

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext=context;
    }

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

        right = MediaPlayer.create(mContext, R.raw.right);
        wrong =  MediaPlayer.create(mContext, R.raw.wrong);

        //TODO: GET NAME, SCORE FOR ALL FRAGMENTS

        init_textViews();

        gameLoop();
    }

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

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

    public void init_textViews() {
        btnOption1 = (Button)getView().findViewById(R.id.btnOption1);
        btnOption2 = (Button)getView().findViewById(R.id.btnOption2);
        btnOption3 = (Button)getView().findViewById(R.id.btnOption3);
        btnOption4 = (Button)getView().findViewById(R.id.btnOption4);
        btnSubmit = (Button)getView().findViewById(R.id.btnSubmit);
        txtQuestion = (TextView) getView().findViewById(R.id.txtQuestion);
        txtScore = (TextView) getView().findViewById(R.id.txtScore);
    }

    public void gameLoop() {
        btnSubmit.setText("SUBMIT");

        init_textViews();

        if (current_question_num < questions.getCurrent_question().length) {

            set_answers_questions();

            btnOption1.setOnClickListener(this);
            btnOption2.setOnClickListener(this);
            btnOption3.setOnClickListener(this);
            btnOption4.setOnClickListener(this);
            btnSubmit.setOnClickListener(this);
            txtQuestion.setOnClickListener(this);

            btnSubmit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    validateAnswer();
                }
            });

        } else {

            //TODO: MAKE IT GO TO THE LEADERBOARD FRAGMENT

        }

    }

    public void set_answers_questions() {
        btnOption1.setBackgroundColor(Color.rgb(109, 212, 126));
        btnOption2.setBackgroundColor(Color.rgb(109, 212, 126));
        btnOption3.setBackgroundColor(Color.rgb(109, 212, 126));
        btnOption4.setBackgroundColor(Color.rgb(109, 212, 126));

        String new_question = questions.getCurrent_question()[current_question_num].toString();
        txtQuestion.setText(new_question);

        int random_num1 = random.nextInt(questions.getAnswers()[current_question_num].length);
        btnOption1.setText(questions.getAnswers()[current_question_num][random_num1]);

        int random_num2 = random.nextInt(questions.getAnswers()[current_question_num].length);
        while (random_num2 == random_num1) {
            random_num2 = random.nextInt(questions.getAnswers()[current_question_num].length);
        }
        btnOption2.setText(questions.getAnswers()[current_question_num][random_num2]);

        int random_num3 = random.nextInt(questions.getAnswers()[current_question_num].length);
        while (random_num3 == random_num1 || random_num3 == random_num2) {
            random_num3 = random.nextInt(questions.getAnswers()[current_question_num].length);
        }
        btnOption3.setText(questions.getAnswers()[current_question_num][random_num3]);

        int random_num4 = random.nextInt(questions.getAnswers()[current_question_num].length);
        while (random_num4 == random_num1 || random_num4 == random_num2 || random_num4 == random_num3) {
            random_num4 = random.nextInt(questions.getAnswers()[current_question_num].length);
        }
        btnOption4.setText(questions.getAnswers()[current_question_num][random_num4]);

        current_answer = questions.getCorrect_answer()[current_question_num].toString();
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.btnOption1:
                btnOption1.setBackgroundColor(Color.GREEN);
                btnOption2.setBackgroundColor(Color.rgb(109, 212, 126));
                btnOption3.setBackgroundColor(Color.rgb(109, 212, 126));
                btnOption4.setBackgroundColor(Color.rgb(109, 212, 126));
                user_answer = btnOption1.getText().toString();
                break;
            case R.id.btnOption2:
                btnOption2.setBackgroundColor(Color.GREEN);
                btnOption1.setBackgroundColor(Color.rgb(109, 212, 126));
                btnOption3.setBackgroundColor(Color.rgb(109, 212, 126));
                btnOption4.setBackgroundColor(Color.rgb(109, 212, 126));
                user_answer = btnOption2.getText().toString();
                break;
            case R.id.btnOption3:
                btnOption3.setBackgroundColor(Color.GREEN);
                btnOption2.setBackgroundColor(Color.rgb(109, 212, 126));
                btnOption1.setBackgroundColor(Color.rgb(109, 212, 126));
                btnOption4.setBackgroundColor(Color.rgb(109, 212, 126));
                user_answer = btnOption3.getText().toString();
                break;
            case R.id.btnOption4:
                btnOption4.setBackgroundColor(Color.GREEN);
                btnOption2.setBackgroundColor(Color.rgb(109, 212, 126));
                btnOption3.setBackgroundColor(Color.rgb(109, 212, 126));
                btnOption1.setBackgroundColor(Color.rgb(109, 212, 126));
                user_answer = btnOption4.getText().toString();
                break;
            default:
                user_answer = "";
                break;
        }
    }

    public void validateAnswer() {
        if (user_answer.equals(current_answer)) {

            right.start();

            score++;

            if (!(btnOption1.getText().toString().equals(questions.getCorrect_answer()[current_question_num]))) {
                btnOption1.setBackgroundColor(Color.WHITE);
            }
            if (!(btnOption2.getText().toString().equals(questions.getCorrect_answer()[current_question_num]))) {
                btnOption2.setBackgroundColor(Color.WHITE);
            }
            if (!(btnOption3.getText().toString().equals(questions.getCorrect_answer()[current_question_num]))) {
                btnOption3.setBackgroundColor(Color.WHITE);
            }
            if (!(btnOption4.getText().toString().equals(questions.getCorrect_answer()[current_question_num]))) {
                btnOption4.setBackgroundColor(Color.WHITE);
            }

            txtScore.setText("Score: " + score);
            btnSubmit.setText("NEXT QUESTION");

            btnSubmit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    current_question_num++;
                    gameLoop();
                }
            });

        } else {
            wrong.start();

            if (!(btnOption1.getText().toString().equals(questions.getCorrect_answer()[current_question_num]))) {
                btnOption1.setBackgroundColor(Color.WHITE);
            }
            if (!(btnOption2.getText().toString().equals(questions.getCorrect_answer()[current_question_num]))) {
                btnOption2.setBackgroundColor(Color.WHITE);
            }
            if (!(btnOption3.getText().toString().equals(questions.getCorrect_answer()[current_question_num]))) {
                btnOption3.setBackgroundColor(Color.WHITE);
            }
            if (!(btnOption4.getText().toString().equals(questions.getCorrect_answer()[current_question_num]))) {
                btnOption4.setBackgroundColor(Color.WHITE);
            }

            if (btnOption1.getText().toString().equals(user_answer)) {
                btnOption1.setBackgroundColor(Color.RED);
            } else if (btnOption2.getText().toString().equals(user_answer)) {
                btnOption2.setBackgroundColor(Color.RED);
            } else if (btnOption3.getText().toString().equals(user_answer)) {
                btnOption3.setBackgroundColor(Color.RED);
            } else if (btnOption4.getText().toString().equals(user_answer)) {
                btnOption4.setBackgroundColor(Color.RED);
            }

            btnSubmit.setText("NEXT QUESTION");
            btnSubmit.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    current_question_num++;
                    gameLoop();
                }
            });
        }
    }
}

最佳答案

在 Fragments 中配置 View

您可以在 Fragment.onCreate(Bundle) 中配置片段实例,但可以在 public View onCreateView(LayoutInflater, ViewGroup, Bundle) 中创建和配置片段的 View 。

在此方法中,您可以膨胀片段 View 的布局并将膨胀的View返回到托管 Activity 。 LayoutInflaterViewGroup 参数是膨胀布局所必需的。 Bundle 将包含此方法可用于从保存的状态重新创建 View 的数据。

Fragment.onCreateView(…)中获取引用的工作方式与在Activity.onCreate(Bundle)中几乎相同。唯一的区别是您在片段的 View 上调用 View.findViewById(int) 。您之前使用的 Activity.findViewById(int) 方法是一种在幕后调用 View.findViewById(int) 的便捷方法。 Fragment 类没有相应的便捷方法,因此您必须调用真实的方法。


演示代码

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) 
{
    View view = inflater.inflate(R.layout.id, container, false);
    Button mButton = view.findViewById(R.id.button_id);
    
    .
    .
    .

    return view;
}

关于java - 如何在片段中使用 findViewById?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71920563/

相关文章:

java - 如何在 ViewPager 上调用 invalidate()

android - 如何在android studio中将android模块转换为java模块

android - AsyncTask 已弃用?使用什么方法代替 onPreExecute 和 onPostExecute?

java - Activity 如何调用动态创建的 fragment 内的方法

android - 在旋转时恢复 viewpager 中的 fragment 及其状态

java - optorsim 抛出 ConcurrentModificationException

java - Handler无法转换为View

java - Java 流中的聚合函数

android - 应用程序流程困惑

android - HashMap 作为 fragment 的参数