udacityandroid / onCreate method in MainActivity.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
// Find the View that shows the numbers category |
TextView numbers = ( TextView ) findViewById ( R . id . numbers ); |
// Set a click listener on that View |
numbers . setOnClickListener ( new View . OnClickListener () |
// The code in this method will be executed when the numbers View is clicked on. |
@ Override |
public void onClick ( View view ) |
Intent numbersIntent = new Intent ( MainActivity . this , NumbersActivity . class ); |
startActivity ( numbersIntent ); |
> |
>); |
Very smart solution, @ZetFury. Congrats!
- Copyright (C) 2016 The Android Open Source Project
- Licensed under the Apache License, Version 2.0 (the «License»);
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity
@Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); // Set the content of the activity to use the activity_main.xml layout file setContentView(R.layout.activity_main); //Find the view which shows the numbers category TextView numbers = (TextView) findViewById(R.id.numbers);
//Set a click listener on that view
numbers.setOnClickListener(new View.OnClickListener() // The code in this method will be called when the numbers view is clicked on.
@OverRide
public void onClick(View view) Intent numbersIntent = new Intent(MainActivity.this, NumbersActivity.class);
startActivity(numbersIntent);
>
>); //Find the view which shows the family category. TextView family = (TextView) findViewById(R.id.family);
//Set a click listener on that view.
family.setOnClickListener(new View.OnClickListener() //The code in this method will be called when the family view is clicked on.
@OverRide
public void onClick(View view) Intent familyIntent = new Intent(MainActivity.this, FamilyActivity.class);
startActivity(familyIntent);
>
>);
//Find the view which shows the colors category. TextView colors = (TextView) findViewById(R.id.colors);
//Set a click listener on that view.
colors.setOnClickListener(new View.OnClickListener() //The code in this method will be called when the colors view is clicked on.
@OverRide
public void onClick(View view) Intent colorsIntent = new Intent(MainActivity.this, ColorsActivity.class);
startActivity(colorsIntent);
>
>);
//Find the view which shows the colors category. TextView phrases = (TextView) findViewById(R.id.phrases);
//Set a click listener on that view.
phrases.setOnClickListener(new View.OnClickListener() //The code in this method will be called when the colors view is clicked on.
@OverRide
public void onClick(View view) Intent phrasesIntent = new Intent(MainActivity.this, PhrasesActivity.class);
startActivity(phrasesIntent);
>
Oncreate method in java
Каждый класс фрагмента наследуется от базового класса Fragment и имеет свой жизненный цикл, состоящий из ряда этапов:
Каждый этап жизненного цикла описывается одной из констант перечисления Lifecycle.State :
Стоит отметить, что представление фрагмента (его визуальный интерфейс или View) имеет отдельный жизненный цикл.
- При создании фрагмент находится в состоянии INITIALIZED . Чтобы фрагмент прошел все остальные этапы жизненного цикла, фрагмент необходимо передать в объект FragmentManager , который далее определяет состояние фрагмента и переводит фрагмент из одного состояния в другое.
- onCreate() : происходит создание фрагмента. В этом методе мы можем получить ранее сохраненное состояние фрагмента через параметр метода Bundle savedInstanceState . (Если фрагмент создается первый раз, то этот объект имеет значение null ) Этот метод вызывается после вызова соответствующего метода onCreate() у activity.
public void onCreate(Bundle savedInstanceState)
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
public void onViewCreated (View view, Bundle savedInstanceState)
public void onViewStateRestored (Bundle savedInstanceState)
Дополнительно для фрагмента определено два метода обратного вызова, которые связаны с прикреплением фрагмента к activity:
- Когда фрагмент добавляется в FragmentManager и прикрепляется к определенному классу Activity, у фрагмента вызывается метод onAttach() . Данный метод вызывается до всех остальных методов жизненного цикла. Начиная с этого момента фрагмент становится активным, и FragmentManager начинает управлять его жизненным циклом.
- Метод onDetach() вызывается, когда фрагмент удаляется из FragmentManager и открепляется от класса Activity. Этот метод вызывается после всех остальных методов жизненного цикла.
В коде класса фрагмента мы можем переопределить все или часть из этих методов. Например, пусть у нас будет определен следующий проект:
В каталоге res/layout определен файл layout для фрагмента - fragment_content.xml со следующей разметкой:
Класс фрагмента использует данный файл для установки представления, а также определяет методы для управления жизненным циклом:
package com.example.fragmentapp; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import android.util.Log; import java.util.Date; public class ContentFragment extends Fragment < private final static String TAG = "ContentFragment"; public ContentFragment()< Log.d(TAG, "Constructor"); >@Override public void onAttach(@NonNull Context context) < super.onAttach(context); Log.d(TAG, "onAttach"); >@Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); Log.d(TAG, "onCreate"); >@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) < Log.d(TAG, "onCreateView"); return inflater.inflate(R.layout.fragment_content, container, false); >@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) < super.onViewCreated(view, savedInstanceState); Button updateButton = view.findViewById(R.id.updateButton); TextView updateBox = view.findViewById(R.id.dateTextView); updateButton.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < String curDate = new Date().toString(); updateBox.setText(curDate); >>); Log.d(TAG, "onViewCreated"); > @Override public void onViewStateRestored(@Nullable Bundle savedInstanceState) < super.onViewStateRestored(savedInstanceState); Log.d(TAG, "onViewStateRestored"); >@Override public void onStart() < super.onStart(); Log.d(TAG, "onStart"); >@Override public void onResume() < super.onResume(); Log.d(TAG, "onResume"); >@Override public void onPause() < super.onPause(); Log.d(TAG, "onPause"); >@Override public void onStop() < super.onStop(); Log.d(TAG, "onStop"); >@Override public void onDestroyView() < super.onDestroyView(); Log.d(TAG, "onDestroyView"); >@Override public void onDestroy() < super.onDestroy(); Log.d(TAG, "onDestroy"); >@Override public void onDetach() < super.onDetach(); Log.d(TAG, "onDetach"); >>
В отличие от прошлой статьи, где рассматривалось создание фрагмента, здесь фрагмент устанавливает представление в методе onCreateView . Для этого в метод inflate() объекта LayoutInflater передается идентификатор ресурса layout и контейнер - объект ViewGroup, в который будет загружаться фрагмент. В итоге метод inflate() возвращает созданное представление.
return inflater.inflate(R.layout.fragment_content, container, false);
При выполнении метода onViewCreated() представление уже создано и оно передается в качестве первого параметра - объекта View, через который с помощью идентификаторов мы можем получить визуальные элементы - TextView и Button, которые определены в представлении.
Для остальных методов жизненного цикла установлено простое логгирование с помощью метода Log.d() .
Пусть в файле activity_main.xml происходит добавление фрагмента:
package com.example.fragmentapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >>
Если мы запустим проект, то на экране устройства мы увидим визуальный интерфейс, определенный для фрагмента.
А в окне Logcat в Android Studio можно будет наблюдать логгирование методов жизненного цикла