Fragment Listener

Jika sebuah fragment membutuhkan komunikasi event dengan activity, fragment sebaiknya mendefinisikan interface dan menyatakan activity harus mengimplementasikan interface ini.

Percobaan

  • Tambahkan fragment baru pada package fragments, dan beri nama MenuFragment. Perhatikan gambar berikut untuk pengaturan pembuatan Fragment.

    MenuFragment

  • Buatlah layout seperti pada gambar berikut.

    Layout MenuFragment

  • Bukalah file MenuFragment.java, perhatikan kode template yang digenerate oleh Android Studio.

  • Fragment yang dibuat, membutuhkan dua interaksi pada tombol Broca Index dan Body Mass Index. Sehingga dibutuhkan dua method pada interface yang perlu didefinisikan.

  • Scroll pada bagian bawah class MenuFragment, modifikasi interface sehingga menjadi seperti berikut.

    public interface OnFragmentInteractionListener {
        void onBrocaIndexButtonClicked();
        void onBodyMassIndexButtonClicked();
    }
    
  • Perhatikan pada class MenuFragment, hapuslah method onButtonPressed. Petunjuk: carilah bagian kode yang berwarna merah.

  • Untuk langkah selanjutnya perlu dilakukan register listener ke dalam event UI tombol. Perhatikan pada method onCreateView, inflate layout dan simpan ke dalam View view.

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_menu, container, false);
    
        // sisipkan register event click nanti di sini.
    
        return view;
    }
    
  • Bind layout dengan findViewById untuk tombol yang dibutuhkan pada method onCreateView.

    Button brocaButton = view.findViewById(R.id.button_broca);
    Button bmiButton = view.findViewById(R.id.button_bmi);
    
  • Register event click pada tombol brocaButton

    brocaButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (mListener != null) {
                mListener.onBrocaIndexButtonClicked();
            }
        }
    });
    
  • Lakukan juga untuk tombol bmiButton

    bmiButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (mListener != null) {
                mListener.onBodyMassIndexButtonClicked();
            }
        }
    });
    
  • Buka kembali MainActivity.java, implementasikan interface MenuFragment.OnFragmentInteractionListener. Jika anda melihat garis bawah warna merah, tekan shortcut Alt + Enter untuk mengimplementasikan method yang dibutuhkan.

    public class MainActivity extends AppCompatActivity implements
      MenuFragment.OnFragmentInteractionListener {
    
    }
    
  • Deklarasikan atribut MenuFragment menuFragment pada class MainActivity.

  • Instansiasi menuFragment pada method onCreate

    menuFragment = new MenuFragment();
    
  • tambahkan kode berikut ini pada akhir pernyataan dalam method onCreate

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.fragment_container, menuFragment)
            .commit();
    
  • Perhatikan pada method onBrocaIndexButtonClicked, pada bagian ini akan diletakkan logic untuk mengganti fragment. Untuk menghitung berat badan ideal, digunakan Broca formula. Referensi

  • Untuk memudahkan perhitungan Broca Index, buatlah class BrocaIndex pada package util.

    public class BrocaIndex {
    
        public static final int MALE = 0;
        public static final int FEMALE = 1;
    
        private int gender;
        private int height;
        private float index;
    
        public BrocaIndex(int gender, int height) {
            this.gender = gender;
            this.height = height;
            this.index = calculate();
        }
    
        public float getIndex() {
            return index;
        }
    
        private float calculate() {
            switch (gender) {
                case MALE: return (height - 100) - ((height - 100) * 0.1f);
                case FEMALE: return (height - 100) + ((height - 100) * 0.15f);
                default: return 0f;
            }
        }
    }
    
  • Buatlah BrocaIndexFragment, perhatikan pengaturan pada gambar berikut.

    BrocaIndexFragment

  • Buatlah layout pada fragment_broca_index.xml sesuai dengan gambar berikut.

    Layout BrocaIndexFragment

  • Bukalah file BrocaIndexFragment.java, perhatikan pada bagian bawah file. Modifikasi interface menjadi berikut.

    public interface OnFragmentInteractionListener {
        void onCalculateBrocaIndexClicked(float index);
    }
    
  • Hapuslah method onButtonPressed yang tidak digunakan.

  • Perhatikan pada method onCreateView, modifikasi kode menjadi berikut.

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_broca_index, container, false);
        final RadioGroup genderGroup = view.findViewById(R.id.group_gender);
        final EditText heightText  = view.findViewById(R.id.input_height);
    
        Button calculateButton = view.findViewById(R.id.button_calculate);
        calculateButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mListener != null) {
                    String heightString = heightText.getText().toString();
                    int checkedId = genderGroup.getCheckedRadioButtonId();
                    if ((checkedId != -1) && !TextUtils.isEmpty(heightString)) {
                        int height = Integer.parseInt(heightString);
                        int gender = (checkedId == R.id.radio_male) ? BrocaIndex.MALE : BrocaIndex.FEMALE;
                        BrocaIndex brocaIndex = new BrocaIndex(gender, height);
                        mListener.onCalculateBrocaIndexClicked(brocaIndex.getIndex());
                    } else {
                        Toast.makeText(getActivity(), "Please select gender and input your height", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
        return view;
    }
    
  • Buka kembali file MainActivity.java, tambahkan implementasi interface BrocaIndexFragment.OnFragmentInteractionListener sehingga menjadi seperti berikut.

    public class MainActivity extends AppCompatActivity implements
          MenuFragment.OnFragmentInteractionListener,
          BrocaIndexFragment.OnFragmentInteractionListener {
    
    }
    
  • Implement method dengan shortcut Alt + Enter.

  • Deklarasikan atribut BrocaIndexFragment brocaIndexFragment.

    private BrocaIndexFragment brocaIndexFragment;
    
  • Instansiasi brocaIndexFragment pada method onCreate.

    brocaIndexFragment = new BrocaIndexFragment();
    
  • Lengkapi kode pada method onBrocaIndexButtonClicked menjadi seperti berikut.

    @Override
    public void onBrocaIndexButtonClicked() {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.fragment_container, brocaIndexFragment)
                .commit();
    }
    
  • Jalankan aplikasi, dan amati apa yang terjadi. Pada tahap ini, aplikasi sudah dapat melakukan perhitungan berat ideal tetapi hasilnya masih belum bisa ditampilkan.

  • Commit perubahan yang anda lakukan, dan push ke repository anda.

hasil yang cocok ""

    Tidak ada hasil yang cocok ""