Как передать тег фрагмента или идентификатор из одного действия в другое? - PullRequest
0 голосов
/ 28 апреля 2020

Я использую нижнюю панель навигации для навигации по различным фрагментам. Некоторые фрагменты могут открыть новые действия. Когда пользователь нажимает эту кнопку «назад», я хотел бы отправить что-то с намерением в основное действие, чтобы вернуть последний открытый фрагмент.

В моем файле MainActivity.kt я пытаюсь использовать это:

if(!intent.getStringExtra("frag").isNullOrEmpty()){
 val frag = intent.getStringExtra("frag")
        selectedFragment = supportFragmentManager.findFragmentByTag(frag)!!
        this.supportFragmentManager.beginTransaction()
            .replace(R.id.frag_container, selectedFragment, frag).commit()
}
when(it.itemId){
     R.id.nav_home ->{
     selectedFragment = HomeFragment()
     toolbar.title = "Notes"
     this.supportFragmentManager.beginTransaction()
      .replace(R.id.frag_container, selectedFragment, "Notes").commit()

     }                                                                                                                                        
}     

и переходя от другого действия:

            mainIntent.putExtra("frag", "Notes")

, но это не работает. Что бы я ни делал, я не посылаю правильную информацию, необходимую для выбора определенного фрагмента. Я не уверен, как я мог передать фрагмент или его ID / тег обратно в основное действие.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Вы можете переопределить onBackPressed () и начать свою деятельность с новым Намерением, обеспечивающим все необходимое. Что-то вроде:

override onBackPressed(){
     val intent = Intent(this, YourMainActivity::class.java).apply {
            putExtra(EXTRA_MESSAGE, message)
        }
        startActivity(intent)
        finish()
   }
0 голосов
/ 28 апреля 2020

Запустите Activity2 с помощью startActivityForResult и используйте метод setResult для отправки данных обратно из Activity2 в Activity1. В Activity1 вам нужно переопределить onActivityResult для получения данных. Например:

В Activity1 запустите Activity2 как:

Intent i = new Intent(this, Activity2.class);

startActivityForResult (i, 1);

В Activity2

Intent intent = new Intent();
intent.putExtra("fragment_id", "first_fragment")
setResult(RESULT_OK, intent);        
finish();

А в Activity1 получите данные с помощью onActivityResult:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
         if(resultCode == RESULT_OK) {
             String strEditText = data.getStringExtra("editTextValue");
         }     
    }
} 
0 голосов
/ 28 апреля 2020

Перешли ли вы от этого другого занятия к основному занятию с новым намерением? Или вы просто звоните fini sh ()? Если вы использовали finish(), то данные, которые вы указали в намерении, отправляться не будут. В любом случае, вы можете попытаться отслеживать последний открытый фрагмент вместо этого в своей основной деятельности. Если вы запускаете другое действие из фрагмента, который присоединен к основному действию без вызова fini sh, то основное действие находится в состоянии паузы. Вы можете просто использовать счетчик stati c, который представляет позицию последнего открытого фрагмента, и заново открыть фрагмент в методе onResume() в своей основной деятельности. Я думаю, что это лучший подход, так как вам не нужно указывать своей основной деятельности предыдущий фрагмент, который нужно открыть.

Надеюсь, это поможет.

...