Kom godt i gang med Android Navigation Component

Navigation refererer til de interaktioner, der giver brugerne mulighed for at navigere på tværs af, ind i og tilbage fra de forskellige indholdsstykker i din app. Android Jetpack’s Navigation-komponent hjælper dig med at implementere navigation, fra enkle knap-klik til mere komplekse mønstre, såsom app-bjælker og navigationsskuffen.

Kilde: developer.android.com

Navigationskomponenten giver en fleksibel løsning til at håndtere fragmenterne og vedligeholde backstack.

Funktioner

  • Let at implementere.
  • Håndtering op og tilbage handlinger korrekt som normal.
  • Håndtering af fragmenttransaktioner.
  • Protected Args – et Gradle-plugin, der giver typesikkerhed, når du navigerer og videregiver information mellem destinationer.
  • ViewModel assist – du kan omfatte en ViewModel til en navigationsgraf for at dele UI-relaterede information mellem grafens destinationer.

Implementering

Føj til construct.gradle (projekt)

classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.1.zero"

anvende pluginet til app-niveau construct.gradle

apply plugin: "androidx.navigation.safeargs.kotlin"

Tilføj afhængigheder

dependencies 

Navigation uden argumenter

Opret 2 fragmenter MainFragment og BasicFragment.

Vi navigerer til BasicFragment fra MainFragment

Opret nav_basic.xml

<?xml model="1.zero" encoding="utf-Eight"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:instruments="http://schemas.android.com/instruments"
    android:id="@+id/nav_basic"
    app:startDestination="@id/mainFragment">

    <fragment
        android:id="@+id/mainFragment"
        instruments:structure="@structure/fragment_main"
        android:title="com.techpaliyal.androidnavigationcomponent.MainFragment">
        <motion android:id="@+id/startBasicFragment"
            app:vacation spot="@id/basicFragment">

        </motion>

    </fragment>

    <fragment
        android:id="@+id/basicFragment"
        instruments:structure="@structure/fragment_basic"
        android:title="com.techpaliyal.androidnavigationcomponent.BasicFragment"/>

</navigation>

app: startDestination = ”@ id / mainFragment” dette vil være indgangsstedet.

dealing with dette bruges til navigation fra mainFragment til basicFragment

Føj navigationsfragment til MainActivity

<fragment
    android:id="@+id/nav_host_fragment"
    android:title="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintLeft_toLeftOf="dad or mum"
    app:layout_constraintRight_toRightOf="dad or mum"
    app:layout_constraintTop_toTopOf="dad or mum"
    app:layout_constraintBottom_toBottomOf="dad or mum"
    app:defaultNavHost="true"
    app:navGraph="@navigation/nav_basic" />

Naviger fra mainFragment til basicFragment ved brug af dealing with id

inde MainFragment.kt på klik på knappen

findNavController().navigate(R.id.basicFragment)

findNavController () vil henvise til den controller, hvor fragmentet er fastgjort.

Navigation med argumenter

Definer argumenter i nav_basic.xml

<fragment
    android:id="@+id/argumentedFragment"
    instruments:structure="@structure/fragment_argumented"
    android:title="com.techpaliyal.androidnavigationcomponent.ArgumentedFragment">
    <argument
        android:title="first_name"
        app:argType="string" />
</fragment>

Ship argument fra BasicFragment til ArgumentedFragment

val motion = MainFragmentDirections.startArgumentedFragment("Yogesh")
            findNavController().navigate(motion)

Få argumenter ind ArgumentedFragment

val params : ArgumentedFragmentArgs by navArgs()

Du kan tjekke den fulde kode på Github.

Kommentar til forslag og problemer.

Kotlin Coroutines | QA – TechPaliyal

Hvad er Kotlin Coroutines?

Kotlin coroutines er en af ​​de mest spændende funktioner i Kotlin. Med dem kan du forenkle arbejdet med asynkrone opgaver på en imponerende måde og gøre koden meget mere læsbar og let at forstå.


Hvordan implementeres kotlin coroutines?

dependencies 
  ...
  implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:x.x.x"
  implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:x.x.x"

Hvorfor bruge kotlin coroutines?

Coroutines er en fantastisk måde at skrive asynkron kode, der er perfekt læsbar og vedligeholdelig.

Sådan oprettes Android Universal Recycler View Adapter med MVVM og databinding

Hej venner, I android applikationsudvikling er den mest gentagne opgave at opsætte genbrugsvisning, i dette indlæg vil vi diskutere, hvordan vi kan skabe en universel adapter til genbrugsvisning i de fleste tilfælde ved hjælp af MVVM og databinding.

Aktivér databinding

Tilføj nedenstående kode i app-niveau construct.gradle inde Android

dataBinding 

Tilføj afhængigheder

Første afhængighed af MVVM-komponenter som ViewModel osv.

implementation 'androidx.lifecycle:lifecycle-extensions:2.1.zero'

Opret et genbrugsvisningselement (item_simple.xml)

<?xml model="1.zero" encoding="utf-Eight"?>
<format xmlns:app="http://schemas.android.com/apk/res-auto">
    <information>
        <variable
            identify="mannequin"
            kind="com.techpaliyal.androidkotlinmvvm.mannequin.BasicModel" />
        <variable
            identify="listener"
            kind="com.techpaliyal.androidkotlinmvvm.listeners.BasicListener" />
    </information>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="mother or father"
        app:layout_constraintStart_toStartOf="mother or father"
        app:layout_constraintEnd_toEndOf="mother or father"
        app:layout_constraintBottom_toBottomOf="mother or father"
        android:padding="5dp"
        android:textSize="16sp"
        android:textual content="@"
        android:onClick="@()->listener.onClick(mannequin)"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</format>

Bemærk: datavariabelens navne skal være mannequin og lytter til alle elementlayouter ved hjælp af Common adapter

Kode til Common Recycler View Adapter

class UniversalRecyclerAdapter<T>(
    @LayoutRes val useful resource: Int, var information: ArrayList<T>,
    val listener: Any? = null
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() 

det bruges til at definere modellen, det er en dynamisk kind.

BR er en mappefil, der opretholder den variable reference for databinding, den er den samme som R fil i Android.

I item_simple.xml variabelnavnet skal være mannequin og lytter så detekteret af Common Recycler Adapter.

Opret en bindingsadapter

@BindingAdapter(worth = ["tools:data","tools:itemList", "tools:itemListener"], requireAll = false)
enjoyable <T> setAdapter(recyclerView: RecyclerView, information : MutableLiveData<ArrayList<T>>, @LayoutRes listItem : Int = R.format.item_simple, itemListener: Any)

Bemærk: Denne kode er direkte inde i RecyclerViewExtension.kt

Denne ovenstående databindingsfunktion hjælper med at indstille en adapter, information (array) og elementlayout direkte fra XML, så der er ingen grund til at gøre fra kode.

activity_basic_listing.xml

<?xml model="1.zero" encoding="utf-Eight"?>
<format xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:instruments="http://schemas.android.com/instruments">
    <information>
        <variable
            identify="viewModel"
            kind="com.techpaliyal.androidkotlinmvvm.ui.view_model.BasicListingActivityViewModel" />
    </information>
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    instruments:context=".ui.exercise.BasicListingActivity">
    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        instruments:itemList="@"
        instruments:itemCount="5"
        instruments:information="@viewModel.information"
        instruments:itemListener="@viewModel.basicListener"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</format>

her bruger vi attributter
værktøjer: itemList = ”@ @ format / item_simple”
værktøjer: information = ”@ viewModel.information”
værktøjer: itemListener = ”@ viewModel.basicListener”

som er deklareret i DataBinding-funktionen

Opret BasicListingActivityViewModel

class BasicListingActivityViewModel(utility: Software) : AndroidViewModel(utility),
    BasicListener<BasicModel> 

ViewModel er en klasse, der er ansvarlig for at forberede og administrere information til en aktivitet eller et fragment.

I denne ViewModel tog vi 2 variabler information og basicListener (at lytte fra genbrugsartikel)

Forbind visningsmodellen med BasicListingActivity

class BasicListingActivity : AppCompatActivity()
    lateinit var binding: ActivityBasicListingBinding
    companion object
        enjoyable begin(context: Context)
    
    override enjoyable onCreate(savedInstanceState: Bundle?) 

Kør nu vores ansøgning.

Output:

Ethvert design kan opnås ved hjælp af dette her er en prøve

Du kan tjekke den fulde kode på Github

Hvis der findes nogen fejl eller har forslag, bedes du kommentere nedenfor.

Faner til Android Material Design (Tab Layout) med Stryg | Grundlæggende

Hej venner, jeg er her med en anden Android-tutorial om fanelayout eller faner med en strygebevægelse.

Fanelayout er synligt beneath værktøjslinjen med View pager, der bruges til at oprette visninger, der kan swipes. Faner er designet til at arbejde med fragmenter. Brug dem til at stryge fragmenter i visningssøgeren. I denne artikel vil vi vise dig, hvordan du implementerer faner til materialedesign i din Android-app.

Når du har oprettet et nyt projekt, skal du åbne construct.gradle og tilføje dette afhængigheds- og synkroniseringsprojekt.

    implementation 'com.google.android.materials:materials:1.zero.zero'

Tilføj fanelayout og vis personsøger i activity_main.xml

<?xml model="1.zero" encoding="utf-Eight"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:instruments="http://schemas.android.com/instruments"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    instruments:context=".MainActivity">

    <com.google.android.materials.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@model/AppTheme.AppBarOverlay">

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="middle"
            android:minHeight="?actionBarSize"
            android:padding="@dimen/appbar_padding"
            android:textual content="@string/app_name"
            android:textAppearance="@model/TextAppearance.Widget.AppCompat.Toolbar.Title" />

        <com.google.android.materials.tabs.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary" />
    </com.google.android.materials.appbar.AppBarLayout>

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Opret en tabulatoradapter “SectionPagerAdapter”, der udvider FragmentPagerAdapter.

SectionPagerAdapter.kt

class SectionsPagerAdapter(fm: FragmentManager) :
    FragmentPagerAdapter(fm) 

Opret fragment til visningssøger, vi tilføjer fragment til adapteren

PlaceholderFragment.kt

class PlaceholderFragment : Fragment() {
    

    override enjoyable onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? 
        val root = inflater.inflate(R.format.fragment_main, container, false)
        val textView: TextView = root.findViewById(R.id.section_label)
       textView.textual content = "Fragment Index $arguments?.getInt(ARG_SECTION_NUMBER)"
        return root
    

    companion object 
        /**
         * The fragment argument representing the part quantity for this
         * fragment.
         */
        personal const val ARG_SECTION_NUMBER = "section_number"

        /**
         * Returns a brand new occasion of this fragment for the given part
         * quantity.
         */
        @JvmStatic
        enjoyable newInstance(sectionNumber: Int): PlaceholderFragment 
    
}

I pladsholderfragment videregiver vi en parameter som indeks for at vise forskellige forekomster af dette fragment i faner.

vi bruger det samme fragment her for at reducere kompleksiteten og forståelsen.

Nu er hoveddelen bindende visningssøger til fanelayout og adapter til visning af personsøger inde i onCreate af MainActivity

MainActivity.kt

class MainActivity : AppCompatActivity() 

Produktion:

Nogle muligheder for at tilpasse fanernes udseende:
app: tabGravity = ”fyld” til navigationsfanen tyngdekraft. Andet er centrum for placering af navigationsfaner fra midten
app: tabIndicatorColor = ”@ farve / hvid” til indikator i faner. Her kan du se en hvid indikator.
app: tabIndicatorHeight = ”4dp” til indikatorhøjde.
app: tabMode = ”quick” til fanetilstand. Andet kan rulles for mange flere faner.
app: tabTextColor = ”@ colour / semi_yellow” for ikke-valgt fanebladets tekstfarve.
app: tabSelectedTextColor = ”@ farve / gul” for den valgte fanebladets tekstfarve.

Hvis du vil tilføje ikoner til fanen, skal du ringe til setIcon () -metoden til fanen. Opret ikon array og tildel hver enkelt til hver fane sådan:

personal int[] tabIcons = ;
tabLayout.getTabAt(zero).setIcon(tabIcons[0]);
tabLayout.getTabAt(1).setIcon(tabIcons[1]);
tabLayout.getTabAt(2).setIcon(tabIcons[2]);

Få fuld kode på Github