Справочник рыбака на Kotlin: Урок 11 и 12

MainActivity.kt

import android.content.res.TypedArray
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.Gravity
import android.view.MenuItem
import android.widget.Toast
import androidx.core.view.GravityCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.navigation.NavigationView
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.main_content.*



class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener{
var adapter: MyAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
nav_view.setNavigationItemSelectedListener (this)

var list = ArrayList<ListItem>()

list.addAll(fillArras(resources.getStringArray(R.array.fish),
resources.getStringArray(R.array.fish_content),getImageId(R.array.fish_image_array)))
rcView.hasFixedSize()
rcView.layoutManager = LinearLayoutManager(this)
adapter = MyAdapter(list,this)
rcView.adapter = adapter


}

override fun onNavigationItemSelected(item: MenuItem): Boolean {

when(item.itemId){

R.id.id_fish ->
{
Toast.makeText(this,"Id fish",Toast.LENGTH_SHORT).show()
adapter?.updateAdapter(fillArras(resources.getStringArray(R.array.fish),
resources.getStringArray(R.array.fish_content),getImageId(R.array.fish_image_array)))

}
R.id.id_na ->
{
Toast.makeText(this,"Id na",Toast.LENGTH_SHORT).show()
adapter?.updateAdapter(fillArras(resources.getStringArray(R.array.na),
resources.getStringArray(R.array.na_content),getImageId(R.array.na_image_array)))

}
R.id.id_sna -> Toast.makeText(this,"Id sna",Toast.LENGTH_SHORT).show()
R.id.id_history -> Toast.makeText(this,"Id history",Toast.LENGTH_SHORT).show()
}
drawerLayout.closeDrawer(GravityCompat.START)

return true
}
fun fillArras(titleArray:Array<String>,contentArray:Array<String>,imageArray:IntArray):List<ListItem>
{
var listItemArray = ArrayList<ListItem>()
for(n in 0..titleArray.size - 1)
{
var listItem = ListItem(imageArray[n],titleArray[n],contentArray[n])
listItemArray.add(listItem)
}
return listItemArray
}

fun getImageId(imageArrayId:Int):IntArray
{
var tArray:TypedArray = resources.obtainTypedArray(imageArrayId)
val count = tArray.length()
val ids = IntArray(count)
for(i in ids.indices)
{
ids[i] = tArray.getResourceId(i,0)
}
tArray.recycle()
return ids
}

}

ListItem.kt

data class ListItem (
var image_id:Int,
var titleText:String,
var contentText:String
)

ContentActivity.kt

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.content_layout.*


class ContentActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.content_layout)
tvTitle.text = intent.getStringExtra("title")
tvContent.text = intent.getStringExtra("content")
im.setImageResource(intent.getIntExtra("image",R.drawable.som))

}
}

MyAdapter.kt

import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView

class MyAdapter (listArray:ArrayList<ListItem>, context: Context): RecyclerView.Adapter<MyAdapter.ViewHolder>() {
var listArrarR = listArray
var contextR = context


class ViewHolder(view: View): RecyclerView.ViewHolder(view) {
val tvTitle = view.findViewById<TextView>(R.id.tvTitle)
val tvContent = view.findViewById<TextView>(R.id.tvContent)
val im = view.findViewById<ImageView>(R.id.im)

fun bind( listItem:ListItem, context: Context)
{
tvTitle.text = listItem.titleText
var textCon = listItem.contentText.substring(0,50) + "..."
tvContent.text = textCon
im.setImageResource(listItem.image_id)
itemView.setOnClickListener(){
Toast.makeText(context,"Pressed : ${tvTitle.text}",Toast.LENGTH_SHORT).show()
val i = Intent(context,ContentActivity::class.java).apply {
putExtra("title",tvTitle.text.toString())
putExtra("content",listItem.contentText)
putExtra("image",listItem.image_id)
}
context.startActivity(i)





}
}

}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(contextR)
return ViewHolder(inflater.inflate(R.layout.item_layout,parent,false))
}

override fun getItemCount(): Int {
return listArrarR.size
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
var listItem = listArrarR.get(position)
holder.bind(listItem,contextR)
}

fun updateAdapter(listArray : List<ListItem>)
{
listArrarR.clear()
listArrarR.addAll(listArray)
notifyDataSetChanged()
}
}

drawer_main_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="navigation_view">
<group android:checkableBehavior="single">
<item android:title="@string/fish"
android:id="@+id/id_fish"
android:icon="@drawable/ic_fish"/>
<item android:title="@string/na"
android:id="@+id/id_na"
android:icon="@drawable/ic_na"/>



</group>
<item android:title="Grupa 2">

<menu>

<item android:title="@string/sna"
android:id="@+id/id_sna"
android:icon="@drawable/ic_sna"/>
<item android:title="@string/history"
android:id="@+id/id_history"
android:icon="@drawable/ic_history"/>
</menu>

</item>
<item android:title="Grupa 3">

<menu>

<item android:title="@string/sna"
android:id="@+id/id_sn"
android:icon="@drawable/ic_sna"/>
<item android:title="@string/history"
android:id="@+id/id_histor"
android:icon="@drawable/ic_history"/>
</menu>

</item>


</menu>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start"

>
<include layout="@layout/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:layout_gravity="start"
app:menu="@menu/drawer_main_menu"
app:headerLayout="@layout/header_main_menu"
/>
</androidx.drawerlayout.widget.DrawerLayout>

content_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="32dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">

<ImageView
android:id="@+id/im"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
app:srcCompat="@drawable/ic_history"
tools:ignore="VectorDrawableCompat" />

<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="TextView"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold" />

<TextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="10dp"
android:text="TextView"
android:textColor="@color/cardview_dark_background" />
</LinearLayout>
</ScrollView>

</androidx.constraintlayout.widget.ConstraintLayout>

header_main_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/header_main_height"
android:background="@color/blue">

<ImageView
android:id="@+id/imageView"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginStart="36dp"
android:layout_marginTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/fish_1"
tools:ignore="VectorDrawableCompat" />

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Fisherman Hand Book"
android:textColor="@color/cardview_light_background"
app:layout_constraintStart_toStartOf="@+id/imageView"
app:layout_constraintTop_toBottomOf="@+id/imageView" />
</androidx.constraintlayout.widget.ConstraintLayout>

item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@android:drawable/editbox_background">

<ImageView
android:id="@+id/im"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/shuca" />

<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="TextView"
android:textColor="@color/design_default_color_on_secondary"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/im" />

<TextView
android:id="@+id/tvContent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="24dp"
android:layout_marginBottom="16dp"
android:text="TextView"
android:textColor="@color/cardview_dark_background"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvTitle"
app:layout_constraintVertical_bias="0.002" />
</androidx.constraintlayout.widget.ConstraintLayout>

main_content.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rcView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.neco_desarrollo.kotlinfishermenhandbook">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ContentActivity" />


</application>

</manifest>

array.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string-array name="fish">
<item>Сом</item>
<item>Налим</item>
<item>Щука</item>
<item>Карась</item>
</string-array>
<string-array name="fish_content">
<item>Рыба сом обладает длинным, сплющенным и довольно мощным телом,
которое лишено чешуи и покрыто слоем слизи, обеспечивающей скольжение
и маневренность рыбы в водном пространстве. Широкая голова сома обычно
имеет уплощенную форму. Усы сома – это важнейший осязательный орган,
с помощью которого рыба отыскивает пищу.</item>
<item>Налим — единственный представитель семейства тресковых, преимущественно
морских рыб, который постоянно живет и размножается в пресных водах. Как правило,
обитает налим в реках и озерах с чистой и прозрачной водой и каменистым или
песчаным (иногда мягким) дном.</item>
<item>Щука, или обыкновенная щука, (лат. Esox lucius) — рыба семейства щуковых.
Распространена в пресных водах Евразии и Северной Америки. Живёт обычно в
прибрежной зоне, в водных зарослях, в непроточных или слабопроточных водах.</item>
<item>Тело высокое с толстой спиной, умеренно сжатое с боков. Чешуя крупная и гладкая
на ощупь. Окраска варьирует в зависимости от места обитания. Золотой карась может
достигать длины тела более 50 см и массы свыше 3 кг, серебряный карась — длины 40 см
и массы до 2 кг.</item>
</string-array>
<array name="fish_image_array">
<item>@drawable/som</item>
<item>@drawable/nalim</item>
<item>@drawable/shuca</item>
<item>@drawable/caras</item>
</array>
<string-array name="na">
<item>Наживка на сома</item>
<item>Наживка на налима</item>
<item>Наживка на щуку</item>
<item>Наживка на карася</item>
</string-array>
<string-array name="na_content">
<item>Характерной особенностью наживки для сома является то, что она должна
обязательно иметь животное происхождение. Это условие подтверждено долгими
годами практики. Рассмотрим самые известные и доступные варианты наживки
для сома.Лучшие наживки для сома - молюски Итак, привычной пищей для данной
разновидности рыбы являются речные ракушки-перловицы – это блюдо можно
считать основным. В нашей местности большинство рыбаков отдают предпочтение
именно этому моллюску, обладающему плоским и выпуклым телом.

Обратите внимание, тушки на крючок следует нанизывать одну к другой плотно,
кроме того, плоская сторона должна закрывать весь крючок. В результате должен
получиться компактных размеров комочек, который будет уверенно держаться
на крючке. А острие крючка рекомендуется закрыть небольшой ракушкой. При ловле
сома неплохо применять аттрактант.</item>
<item>Наиболее рекомендованной наживкой для осенней ловли налима является пучок
навозных червей или выползки. Черви входят в рацион питания налима и других
рыб. Но может так случиться, что другая рыба поймается на крючок, а затем к
снасти подойдет налим. В таком случае рыба, оказавшаяся на крючке, послужит в
качестве живца.</item>
<item>Живец — наживка номер один для охоты за щукой в любое время года. На живую
рыбку хищницу ловят с помощью поплавочной удочки и кружков по открытой воде.
Также эту наживку применяют в течение всего года для рыбалки с жерлицами . В качестве</item>
<item>Когда встает вопрос о том, на что ловить карася, то в качестве идеального
варианта наживки для карася рассматривается большое разнообразие наживок
органического и неорганического происхождения. Не стоит отчаиваться, это вполне
нормальное явление, ведь подобрать оптимальный вариант бывает не так уж просто.

Представляем вашему вниманию основные живые наживки для ловли карася, эффективность
которых проверена на практике – карась на них клюет охотно: навозный и
калифорнийский червь, шитик, мотыль, опарыш. Не стоит обходить вниманием и
растительные наживки, на которые карась ведется не хуже. Это - батон, манка, блин,
тесто со всевозможными добавками, геркулесовая каша, хлебный мякиш, перловка и кукуруза.

Кроме того, опытный рыбак иногда должен иметь на вооружении такие бутерброды как: мотыль
- опарыш, червь - опарыш, хлебный мякиш - опарыш, батон- опарыш, кукуруза- опарыш.
Из вышесказанного можно сделать следующий вывод: опарыш, подобно льду в дорогом
коктейле – присутствует везде, но хорошей наживкой для карася также станут червь - мотыль.
</item>
</string-array>
<array name="na_image_array">
<item>@drawable/som</item>
<item>@drawable/nalim</item>
<item>@drawable/shuca</item>
<item>@drawable/caras</item>

</array>

</resources>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#6200EE</color>
<color name="colorPrimaryDark">#A91D17D1</color>
<color name="colorAccent">#196860</color>
<color name="black">#000000</color>
<color name="blue">#2556E7</color>
</resources>

dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="header_main_height">170dp</dimen>
</resources>

strings.xml

<resources>
<string name="app_name">KotlinFishermenHandbook</string>
<string name="fish">Рыбы</string>
<string name="na">Наживки</string>
<string name="sna">Снасти</string>
<string name="history">Истории</string>


</resources>

styles.xml

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowFullscreen">true</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

</resources>

Не забудьте добавить свои картинки с теме же названиями как у меня! Картинки к проекту не прилагаються!

8 комментариев для “Справочник рыбака на Kotlin: Урок 11 и 12”

  1. Здравствуйте Сергей!
    Спасибо большое за ваши уроки.

    Смотрю ваши уроки и пытаюсь понять логику, но застрял на 14 уроке по Котлин.
    Пересматриваю урок 5 про intent, не доходит до меня)
    Не могу вникнуть как прописать intent, чтоб пришло то, что нажму

    var index:Int =
    webView.loadUrl(“file:///android_asset/item_0.html”)

    изменения надо делать и в MainActivity или только в ContentActivity?

    Очень прошу помощь

    1. Когда отправляем intent нужно указать пару “ключь, значение” по ключу на следующем активити получаем intent а значение это то что хотим отправить

  2. Доброго времени суток Сергей
    у меня ваше приложение ругается на
    import kotlinx.android.synthetic.main.content_layout.*
    как импортировать подскажите плиз.

  3. Присоединяюсь к Анатолию
    import kotlinx.android.synthetic.main.content_layout.* – выдает ошибку
    как я понимаю kotlinx больше не является рекомендуемой практикой
    как импортировать подскажите плиз.

Добавить комментарий для Виталий Отменить ответ

Ваш адрес email не будет опубликован.