MyTetra Share
Делитесь знаниями!
CrimeFragment.java
21.04.2017
18:44
Раздел: Android - books - AndroidProgramming2e - 12 Диалоговые окна
CrimeFragment.java
package com.bignerdranch.android.criminalintent; 
 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.EditText; 
 
import java.util.Date; 
import java.util.UUID; 
 
public class CrimeFragment extends Fragment { 
 
    private static final String ARG_CRIME_ID = "crime_id"; 
//    Добавьте в CrimeFragment константу для метки DatePickerFragment. 
    private static final String DIALOG_DATE = "DialogDate"; 
 
    private static final int REQUEST_DATE = 0; 
 
    private Crime mCrime; 
    private EditText mTitleField; 
    private Button mDateButton; 
    private CheckBox mSolvedCheckBox; 
 
    public static CrimeFragment newInstance(UUID crimeId) { 
        Bundle args = new Bundle(); 
        args.putSerializable(ARG_CRIME_ID, crimeId); 
 
        CrimeFragment fragment = new CrimeFragment(); 
        fragment.setArguments(args); 
        return fragment; 
    } 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID); 
        mCrime = CrimeLab.get(getActivity()).getCrime(crimeId); 
    } 
 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        View v = inflater.inflate(R.layout.fragment_crime, container, false); 
 
        mTitleField = (EditText) v.findViewById(R.id.crime_title); 
        mTitleField.setText(mCrime.getTitle()); 
        mTitleField.addTextChangedListener(new TextWatcher() { 
            @Override 
            public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
 
            } 
 
            @Override 
            public void onTextChanged(CharSequence s, int start, int before, int count) { 
                mCrime.setTitle(s.toString()); 
            } 
 
            @Override 
            public void afterTextChanged(Editable s) { 
 
            } 
        }); 
 
//        Отображение DialogFragment 
//        Как и все фрагменты, экземпляры DialogFragment находятся под управлением экземпляра FragmentManager активности-хоста. Для добавления экземпляра DialogFragment в FragmentManager и вывода его на экран используются следующие методы экземпляра фрагмента: 
//        public void show(FragmentManager manager, String tag) 
//        public void show(FragmentTransaction transaction, String tag) 
//        Строковый параметр однозначно идентифицирует DialogFragment в списке FragmentManager. Выбор версии (с FragmentManager или FragmentTransaction) зависит только от вас: если передать FragmentTransaction, за создание и закрепление транзакции отвечаете вы. При передаче FragmentManager транзакция автоматически создается и закрепляется для вас. 
 
        mDateButton = (Button) v.findViewById(R.id.crime_date); 
        updateDate(); 
//        назначьте слушателя View.OnClickListener, который отображает DatePickerFragment при нажатии 
//        кнопки даты 
 
        mDateButton.setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                FragmentManager manager = getFragmentManager(); 
                DatePickerFragment dialog = DatePickerFragment 
                        .newInstance(mCrime.getDate()); 
//             Возвращение данных CrimeFragment 
//             Чтобы экземпляр CrimeFragment получал данные от DatePickerFragment, нам необходимо каким-то образом отслеживать отношения между двумя фрагментами. С активностями вы вызываете startActivityForResult(…), а ActivityManager отслеживает отношения между родительской и дочерней активностью. Когда дочерняя активность прекращает существование, ActivityManager знает, какая активность должна получить результат. Назначение целевого фрагмента. Для создания аналогичной связи можно назначить CrimeFragment целевым фрагментом (target fragment) для DatePickerFragment. Эта связь будет автоматически восстановлена после того, как и CrimeFragment, и DatePickerFragment уничтожаются и заново создаются ОС. Для этого вызывается следующий метод Fragment: 
//                public void setTargetFragment(Fragment fragment, int requestCode) 
//             Метод получает фрагмент, который станет целевым, и код запроса, аналогичный передаваемому startActivityForResult(…). По коду запроса целевой фрагмент позднее может определить, какой фрагмент возвращает информацию. FragmentManager сохраняет целевой фрагмент и код запроса. 
                dialog.setTargetFragment(CrimeFragment.this, REQUEST_DATE); 
                dialog.show(manager, DIALOG_DATE); 
            } 
        }); 
 
        mSolvedCheckBox = (CheckBox) v.findViewById(R.id.crime_solved); 
        mSolvedCheckBox.setChecked(mCrime.isSolved()); 
        mSolvedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
            @Override 
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
                mCrime.setSolved(isChecked); 
            } 
        }); 
 
        return v; 
    } 
 
    @Override 
//    переопределите метод onActivityResult(…), чтобы он возвращал дополнение, задавал дату в Crime и обновлял текст кнопки даты. 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
        if (resultCode != Activity.RESULT_OK) { 
            return; 
        } 
 
        if (requestCode == REQUEST_DATE) { 
            Date date = (Date) data 
                    .getSerializableExtra(DatePickerFragment.EXTRA_DATE); 
            mCrime.setDate(date); 
            updateDate(); 
        } 
    } 
//    Код, задающий текст кнопки, идентичен коду из onCreateView(…). Чтобы избежать задания текста в двух местах, мы инкапсулируем этот код в закрытом методе updateDate(), а затем вызовем его в onCreateView(…) и onActivityResult(…). 
 
    private void updateDate() { 
        mDateButton.setText(mCrime.getDate().toString()); 
    } 
} 

 
MyTetra Share v.0.52
Яндекс индекс цитирования