すでに追加されたフラグメントを表示できません -- android フィールド と android-fragments フィールド と kotlin フィールド 関連 問題

Can't show already added fragment












1
vote

問題

日本語

私は次のことをしようとしています:

  1. アプリを起動 - ロードをフラグメント
  2. a - fragment bのロード
  3. のボタンをクリックします
  4. Bのボタンをクリックする - Fragment Aロード
  5. これは主な活性のための方法です:

    <事前> <コード> private fun addBrowseBooksFragment() { var browseBooksFragment = BrowseBooksFragment() val fragmentManager = fragmentManager val fragmentTransaction = fragmentManager.beginTransaction() if ((fragmentManager.findFragmentByTag("BrowseBooksFragment")) != null){ browseBooksFragment = fragmentManager.findFragmentByTag("BrowseBooksFragment") as BrowseBooksFragment println("working fine up to here") if (browseBooksFragment.isAdded) { println("Showing Added Fragment") browseBooksFragment.setCallBackInterface(this) fragmentTransaction.show(browseBooksFragment) } } else { browseBooksFragment.setCallBackInterface(this) fragmentTransaction.replace(R.id.fragmentContainer, browseBooksFragment, "BrowseBooksFragment") } fragmentTransaction.commit() }

    else は、問題なく負荷をかけるために機能します。フラグメントBも問題なくロードされます。しかし、ボタンをクリックしてフラグメントAに戻ると、 browseBooksFragment.isAdded はfalseを返しますが、 browseBooksFragment はNULLではありません。タグごとにフラグメントを返します。

    replace を使用しないで、 show を使用してフラグメント全体を再作成しようとしています。

    isAdded 条件をコメントアウトし、<コード> show へのコメントをコメントアウトして追加する必要があります。 例外

    <事前> <コード> // if (browseBooksFragment.isAdded) { println("Showing Added Fragment") browseBooksFragment.setCallBackInterface(this) fragmentTransaction.replace(R.id.fragmentContainer, browseBooksFragment, "BrowseBooksFragment") // fragmentTransaction.show(browseBooksFragment) // }

    すでに追加されたフラグメントAを正しく表示する方法

英語

I'm trying to do the following:

  1. Launch app - Fragment A loads
  2. Click button on A - Fragment B loads
  3. Click button on B - Fragment A loads

This is a method in MainActivity:

private fun addBrowseBooksFragment() {          var browseBooksFragment = BrowseBooksFragment()         val fragmentManager = fragmentManager         val fragmentTransaction = fragmentManager.beginTransaction()          if ((fragmentManager.findFragmentByTag("BrowseBooksFragment")) != null){             browseBooksFragment = fragmentManager.findFragmentByTag("BrowseBooksFragment") as BrowseBooksFragment              println("working fine up to here")              if (browseBooksFragment.isAdded) {                 println("Showing Added Fragment")                 browseBooksFragment.setCallBackInterface(this)                 fragmentTransaction.show(browseBooksFragment)             }          } else {             browseBooksFragment.setCallBackInterface(this)             fragmentTransaction.replace(R.id.fragmentContainer, browseBooksFragment, "BrowseBooksFragment")         }         fragmentTransaction.commit()     } 

The else works fine because Fragment A loads without a problem. Fragment B also loads without a problem. But when I click the button to go back to Fragment A, browseBooksFragment.isAdded returns false but browseBooksFragment is not null. It returns the fragment by tag.

I'm trying to avoid recreating the whole fragment by not using replace and instead use show.

I should add that if I comment out the isAdded condition and change show to replace, I get a Fragment already added exception.

//            if (browseBooksFragment.isAdded) {                 println("Showing Added Fragment")                 browseBooksFragment.setCallBackInterface(this)                 fragmentTransaction.replace(R.id.fragmentContainer, browseBooksFragment, "BrowseBooksFragment") //                fragmentTransaction.show(browseBooksFragment) //            } 

How do I show the already added Fragment A properly?

</div
        
     
     

回答リスト

3
 
vote
vote
ベストアンサー
 

UITabBarController9 の代わりに、 UIViewController0 を使用する必要があります。このようにして、既存のフラグメントを交換していませんが、代わりにフラグメントaの上にフラグメントBを押します。

EX.

<事前> <コード> UIViewController1

このようにして、以前のフラグメントをロードしたい場合は

<事前> <コード> UIViewController2

とこれはバックスタックからフラグメントBをポーリングし、以前に作成されたフラグメントAを示しています。

 

Instead of replace(), you should use add(). This way you are not replacing an existing fragment, but instead pushing a fragment B on top of fragment A.

For ex.

FragmentManager fm = getSupportFragmentManager(); fm.beginTransaction()    .add("id of your fragment container", fragment, fragment.class.getSimpleName())    .addToBackStack(fragment.class.getSimpleName())    .commit(); 

This way if you want to load previous fragment you just have to do

fm.popBackStack(); 

And this will pop the fragment B from the BackStack, showing the previously created fragment A.

</div
 
 
 
 

関連する質問

0  rxjava 2はエラーが発生している間は呼び出されません  ( Rxjava 2 on error is not called while unit testing ) 
RXJAVA 2はエラーが発生している間は呼び出されません。 Rxjava 2でコトリンを使用しています。 方法 <事前> <コード> $(document).keydown(function(event) { if (event.keyCode =...

3  KotlinプログラムからJavaライブラリを使用する方法  ( How to use java library from kotlin program ) 
コトリンでプログラミングしています。 私は java で書かれたライブラリを使用する必要があり、Maven Centralから来ています。 私は私の pom.xml に依存関係を置き、私の kotlin コードでライブラリをインポートすることができます。 しか...

54  kotlinにswitch-caseステートメントを実装する方法  ( How to implement switch case statement in kotlin ) 
以下のJava 99887661 文のコードコードの記述方法をKotlin?に実装する方法 <事前> <コード> switch (5) { case 1: // Do code break; case 2: // Do...

2  kotlinは、パラメータ化されたインタフェースを実装するタイプ内のパス  ( Kotlin pass in a type that implements a parameterized interface ) 
次の作業Javaコードを持っていますが、それをKotlinに変換すると、コードはコンパイルされません Java コード <事前> <コード> public interface Presenter<V> { void attachView(V view...

2  JUnitテストでのKotlinプロパティの初期化器の実行  ( Kotlin property initializer execution in junit tests ) 
Kotlinでテストするための抽象基本クラスを持っています: <事前> <コード> abstract class TestBase(){ protected var session = configure() private fun configu...

12  未解決の参照:JUnit  ( Unresolved reference junit ) 
kotlinとlibgdxフレームワークを使ってゲームを書いています。テストが大変です。私は簡単なテストを作成する方法をいくつかの基本的なチュートリアルに渡しました。そして卒業の設定方法。クラスをクリックして[テストの作成]を選択しました。 しかし、プロジェ...

0  バイトストリームを解析するときのkotlin bytes vs enums  ( Kotlin bytes vs enums when parsing byte stream ) 
kotlinでバイトストリームを解析しようとしています。パターンが一連のオペコードバイトの後にオペコードに基づく任意のバイトを解析しようとしています。だから私は列挙体を設定し始めました。 <事前> <コード> EVP_*2 だから私の解析ループを構築すると...

2  InstagramかDirectがアイコンランチャーの形状がどのように変わらないか、Android Oreoで丸を囲む  ( How instagram or direct not change shape in icon launcher to circle in android o ) 
Android Oreoの異なるマスク(サークルスクエア、ティアドロップ)にInstagramがどのように変わらないか。 Instagramをインストールしたデバイスのスクリーンショット: Androidが示すアイコンのデザインを作成するこのページに...

0  Kotlinで動的ネストされたオブジェクトを初期化する方法  ( How can i initialise a dynamic nested object in kotlin ) 
変更したい動的クラスを持つオブジェクト構造を作成しています。 トップレベル: <事前> <コード> config.rb3 第2レベル: <事前> <コード> config.rb4 config.rb5 は私が変更したいものです。 config.rb7 ...

4  jackson-dataformat-csvは不明なプロパティを無視しません  ( Jackson dataformat csv does not ignore unknown properties ) 
.csvファイルをjackson-dataformat-csvで解析しようとしています。ファイルには、プログラムに関連しない列がたくさん含まれています。 データクラスの<コード> @JsonIgnoreProperties(ignoreUnknown = ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有