Связь между двумя действиями с использованием интерфейса не работает должным образом - PullRequest
0 голосов
/ 27 января 2019

ПРОБЛЕМА: При отправке данных из занятие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)

}

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Это плохая идея назначить Activity1 для Activity2 через интерфейс, попытаться использовать в Activity1: startActivityForResult(intent, requestCode) сделать все, что вы хотите в Activity2, а затем вызвать: onActivityResult(requestCode, resultCode, intent); и в Activity1 переопределить функцию: onActivityResult() и взятьлогические данные из намерения.

0 голосов
/ 27 января 2019

Ваша проблема в том, что вы вызываете onReturnedToActivity () для нового экземпляра MainActivity, а не для того, с которого вы начали или к которому вы вернетесь.

Существует несколько способов обмена данными между действиямиОдним из них является использование startActivityForResult ().

Я думаю, что ваша проблема заключается в том, что Activity1 будет остановлен, поэтому вы не можете отправлять ему данные из Activity2.Однако вы можете запустить Activity2 с startActivityForResult и вернуть результат.Вот пример из документации .

Начало действия.

const val PICK_CONTACT_REQUEST = 1  // The request code
...
private fun pickContact() {
    Intent(Intent.ACTION_PICK, Uri.parse("content://contacts")).also { pickContactIntent ->
        pickContactIntent.type = Phone.CONTENT_TYPE // Show user only contacts w/ phone numbers
        startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST)
    }
}

Получение возвращенных данных.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    // Check which request we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == Activity.RESULT_OK) {
            // The user picked a contact.
            // The Intent's data Uri identifies which contact was selected.

            // Do something with the contact here (bigger example below)
        }
    }
}

Другие схемы включают в себяГлобальный синглтон, запускающий действия с Intents или использующий SharedPreferences, записывающий данные в одном действии и затем считывающий их обратно в другом.Если вы выполните поиск по android share data between activities, вы увидите, что есть лучший вариант для достижения этой цели.

...