ПРОБЛЕМА: При отправке данных из занятие2 в занятие1 с использованием интерфейса приводит к невозможности назначения отправляемых данных в занятие1 , даже еслиэто назначается.Следовательно, Activity1 члены переменные автоматически устанавливаются на ноль.
ДЕТАЛИ НАСТРОЙКИ: При нажатии кнопки в Activity1 , запускает Activity2.Теперь пользователь может выполнять любую работу в activity2 .Но как только пользователь выполняет работу в activity2 , мой пользовательский интерфейс отправляет данные в activity1 .Предполагается, что Activity1 присваивает это отправленное значение своей переменной-члену, и когда пользователь возвращается к activity1 , onRestart () , метод действия1 связан с обновлением пользователя.-интерфейс с новым значением.
НАСТРОЙКА В ТОЧКАХ:
1- Пользователь нажимает кнопку на ACTIVITY1
2- Кнопка открывается ACTIVITY2
3- Пользователь выполняет действие, которое запускает мой интерфейс для отправки данных
4- Интерфейс отправляет данные на ACTIVITY1 в фоновом режиме (ACTIVITY2 все еще отображается)
5- Отправленные данные назначаются на ACTIVITY1 переменная-член (булево) через интерфейс
6- Пользователь нажимает на ACTIVITY2 и возвращается к ACTIVITY1
7- ONRESTART () из ACTIVITY1 срабатывает
8- ONRESTART () проверяет, является ли логическое значение истинным, затем обновите пользовательский интерфейс
Но здесь начинается моя путаница. Почему назначенное логическое значение все еще равно нулю даже после назначения? Почему переменные-члены ACTIVITY1 теряют присвоенные значения?
КОД:
Интерфейс
override fun onReturnedToActivity(actionID: Int) {
when(actionID)
{
3 ->
{
newNoteCreated = true
}
}
}
ONRESTART ()
override fun onRestart() {
super.onRestart()
if(newNoteCreated) //variable is null not true.
{
Toast.makeText(this,"TRUE",Toast.LENGTH_SHORT).show()
mDrawer!!.updateBadge(3, StringHolder(dbHandler.totalNotes().toString() ))
newNoteCreated = false
}
Пожалуйста, расскажите мне об этой проблеме.Я пытался найти его решение на SO, но пока ничего не отвечает на мой вопрос.Я знаю, что существуют другие способы передачи данных между действиями, но я пытаюсь особенно использовать интерфейсы.
Цитирование из
https://developer.android.com/reference/android/app/Activity#ActivityLifecycle
" Если действие полностью скрыто другим действием, оно останавливается. Оно по-прежнему сохраняет всю информацию о состоянии и членах , однако оно больше не отображается для пользователя, поэтому его окно скрыто и оно будет скрыточасто быть убитым системой, когда память нужна где-то еще."
Тогда почему моя деятельность теряет свои переменные данные?
РЕДАКТИРОВАТЬ
Основная деятельность (ДЕЯТЕЛЬНОСТЬ1)
class MainActivity : AppCompatActivity(), ContextBarVisibilityListener, OnActionPerformedBadgeUpdater, ActivityReturningStateNotify {
private val dbHandler: PediaDatabase = PediaDatabase(this)
private var mDrawer: Drawer? = null
private var filePath: String? = null
private var backupFileName: String? = null
private var listBt: MenuItem? = null
private var gridBt: MenuItem? = null
private var frontAppName: TextView? = null
private var buttonStatePref: SharedPreferences? = null
private var speedDialView: SpeedDialView? = null
private var trashNotesCount: String? = null
private var archiveNotesCount: String? = null
private var onLayoutChange: LayoutChangeListener? = null
private var newNoteCreated: Boolean = false //THIS IS THE BOOL
private lateinit var mAdView: AdView
companion object
{
private const val LAYOUT_USER_PREF = "layout_preference"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
onLayoutChange = NotesFrag()
if(savedInstanceState == null) //prevents reloading fragment
{
val transaction = supportFragmentManager.beginTransaction()
transaction.add(R.id.innerFrameLayout,NotesFrag()).commit()
}
trashNotesCount = dbHandler.trashedNotesCount().toString()
archiveNotesCount = dbHandler.archivedNoteCount().toString()
val drawerTrashBt: PrimaryDrawerItem = PrimaryDrawerItem().withIdentifier(1).withName("Trash Bin")
.withIcon(R.drawable.delete_note_image)
.withBadge(trashNotesCount)
.withSelectedIcon(R.drawable.delete_drawer_selected)
val drawerArchiveBt: PrimaryDrawerItem = PrimaryDrawerItem().withIdentifier(2).withName("Archive")
.withIcon(R.drawable.archive_note_img)
.withBadge(archiveNotesCount)
.withSelectedIcon(R.drawable.archive_drawer_selected)
val drawerNotesBt: PrimaryDrawerItem = PrimaryDrawerItem().withIdentifier(3).withName("Notes")
.withIcon(R.drawable.notes_img)
.withBadge(dbHandler.totalNotes().toString())
.withSelectedIcon(R.drawable.notes_drawer_selected)
val drawerLockedNotesBt: PrimaryDrawerItem = PrimaryDrawerItem().withIdentifier(4).withName("Locked Notes")
.withIcon(R.drawable.lock_button)
.withBadge("1")
.withSelectedIcon(R.drawable.locked_drawer_selected)
val drawerReminderNotesBt: PrimaryDrawerItem = PrimaryDrawerItem().withIdentifier(5).withName("Reminder Notes")
.withIcon(R.drawable.reminder_notes)
.withBadge("1")
.withSelectedIcon(R.drawable.reminder_drawer_selected)
val drawerFavouriteNotesBt: PrimaryDrawerItem = PrimaryDrawerItem().withIdentifier(6).withName("Favourite Notes")
.withIcon(R.drawable.rate_app_star_img)
.withBadge("1")
.withSelectedIcon(R.drawable.favourite_drawer_selected)
val drawerSettingsBt: PrimaryDrawerItem = PrimaryDrawerItem().withIdentifier(7).withName("Settings")
.withIcon(R.drawable.settings_drawer)
mDrawer = DrawerBuilder().withActivity(this)
.withHeader(R.layout.navbar_header)
.addDrawerItems(drawerNotesBt,drawerArchiveBt,drawerTrashBt,
drawerLockedNotesBt,drawerReminderNotesBt,
drawerFavouriteNotesBt,DividerDrawerItem(), drawerSettingsBt)
.withOnDrawerItemClickListener(object: Drawer.OnDrawerItemClickListener{
override fun onItemClick(view: View?, position: Int, drawerItem: IDrawerItem<*, *>?): Boolean {
when(position)
{
1 ->
{
frontAppName!!.text = "Wonder Notes"
speedDialView!!.show() //show again because traversing to other fragments hides it
val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.innerFrameLayout, NotesFrag())
transaction.addToBackStack(null)
transaction.commit()
}
2 ->
{
speedDialView!!.hide()
supportFragmentManager.beginTransaction().replace(R.id.innerFrameLayout,ArchiveFragment()).commit()
}
3 ->
{
frontAppName!!.text = "Trash"
speedDialView!!.hide()
fabLayoutBehaviourSetter(false)
supportFragmentManager.beginTransaction().replace(R.id.innerFrameLayout, TrashFragment()).commit()
}
4 -> Log.d("locked notes","1")
5 -> Log.d("reminder","1")
6 -> Log.d("favourite","1")
}
return false // false closes drawer on click
}
}).build()
/*Below code handles swipe tabs adapter setting and displaying
* and implements fragments to viewpager programitically */
// mainActivityViewPagerID.adapter = ViewPagerAdapter(supportFragmentManager)
// attachNotesFrag()
//mainTabsID.setupWithViewPager(mainActivityViewPagerID)
//mainTabsID.setTabTextColors(Color.DKGRAY, Color.parseColor("white"))
val drawerOpener = findViewById<ImageButton>(R.id.drawerOpenImgBt)
val noteCounterAsBt = findViewById<TextView>(R.id.showNotesCountID)
drawerOpener.setOnClickListener { mDrawer!!.openDrawer() }
noteCounterAsBt.setOnClickListener { mDrawer!!.openDrawer() }
//navigationView.setNavigationItemSelectedListener(this)
val customToolbar: Toolbar = findViewById(R.id.toolbarID)
setSupportActionBar(customToolbar)
supportActionBar!!.setDisplayShowTitleEnabled(false) //set main title off
val toolbarTxtView = findViewById<TextView>(R.id.toolbar_title)
toolbarTxtView.visibility = View.GONE
checkForStoragePermission()
}//on create
override fun onContextBarVisibilityChange(isVisible: Boolean) { //custom interface
if(isVisible)
{
speedDialView!!.hide()
fabLayoutBehaviourSetter(false) //remove scrolling behaviour
}
else
{
speedDialView!!.show()
fabLayoutBehaviourSetter(true) //set scrolling behaviour
}
}
override fun onReturnedToActivity(actionID: Int) { ///it just recieves value from ACTIVITY2 and assign its value to ACTIVTY1`s "newNoteCreated" varaible
when(actionID)
{
3 ->
{
Log.d("INTERFACE","CALLED $actionID")
newNoteCreated = true
Log.d("INTERFACE","CALLED $newNoteCreated")
}
}
}
СПРАВОЧНАЯ ДЕЯТЕЛЬНОСТЬ (ДЕЯТЕЛЬНОСТЬ2) Я включаю только ту часть, где интерфейс отправляет данные обратно в активность 1, потому что код действия 2 очень длинный и, скорее всего, запутает читателей.
onActivityReturningStateNotify = MainActivity()
dbHandler!!.createNote(note)
//onActionPerformedBadgeUpdater!!.onActionPerformed(3)
onActivityReturningStateNotify!!.onReturnedToActivity(3)
ИНТЕРФЕЙС
interface ActivityReturningStateNotify {
fun onReturnedToActivity(actionID: Int)
}