Android: раздувать макет на фрагмент, но onCreate не запускается - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь использовать фрагменты в Android.

Итак, в методе "getItem ()" в классе "TabAdapter", у меня есть:

public Fragment getItem(int position) {
        switch (position) {
            case 0:
                Browse tab1 = new Browse();
                return tab1;
            case 1:
                Create tab2 = new Create();
                return tab2;
            default:
                return null;
        }
    }

Итак, вкласс "Browse", я использую inflate для помещения во фрагмент TabLayout макета, который я хочу использовать:

public class Browse extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.activity_browse, container, false);
        return rootView;
    }

И в этом классе внутренний класс, имеющий метод "onCreate ()"

   public class BrowseInner extends AppCompatActivity{

        DBManager db = new DBManager(this);
        DBManager.DatabaseHelper dbh = new DBManager.DatabaseHelper(this);

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            System.out.println("TRYTOSTAMP");
            setContentView(R.layout.activity_browse);
            Cursor cursor = dbh.giveAllItemFromDB();
... //"and all the logics to interact with layout"...
}

Но, таким образом, у меня есть только макет в Fragment TabLayout, как он определен в .xml дизайне, но я не могу взаимодействовать с ним (запрос не обработан, поэтому поля в макетене заполнить, событие на кнопке не вызывается и так далее ...) Где я делаю не так? Заранее спасибо.

1 Ответ

0 голосов
/ 08 октября 2019

Если я прав, вы хотите поместить данные, которые вы получаете в BrowseInner, в поля двух фрагментов?

В общем, вы все делаете неправильно.

У вас нет значимых имен, таких как BrowseInnerActivity, BrowseFragment и CreateFragment

Вы можете вернуться вот так. Нет необходимости назначать.

public Fragment getItem(int position) {
        switch (position) {
             case 0:
                    return new Browse();
                case 1:
                    return new Create();
                default:
                    return null;
        }
    }

Почему вы пытаетесь раздувать один и тот же макет как в Задании, так и во Фрагменте? Даже если виды должны быть одинаковыми, вам нужно создать отдельные макеты и присвоить им соответствующие имена. Нельзя раздувать во Фрагменте: R.layout.activity_browse

И выше приведено базовое программирование. Ваш дизайн не правильный. Действия и фрагменты являются «представлениями» в терминах MVP, MVVM и т. Д. Они должны быть пассивными. Только представьте некоторые данные и уведомите что-нибудь, например ViewModel о некоторых действиях, выполненных над ними.

Таким образом, в вашем случае Activity может создавать только фрагменты. Вы можете создать ViewModel, которая является общей для двух фрагментов. ViewModel может содержать ссылку на некоторый репозиторий и обновлять объекты LiveData. Затем фрагменты могут наблюдать LiveData и делать с данными то, что им нужно делать. Есть довольно хорошие рекомендации по дизайну:

https://developer.android.com/jetpack/docs/guide

А вот несколько примеров приложений:

https://github.com/android/architecture-samples

И в целом вы должны пониматьчто такое MVVM, ViewModel, LiveData и т. д.

...