2017-05-05 19 views
0

findFragmentByTag()がヌルを返す問題については数多くの記事を読んでいますが、数日後にはまだ動作しません。だから私自身の質問を投稿するのが聞こえます。さらにfindFragmentByTag()はnullを返します

私は1つの容器と3つの断片を持っています。私はA - > B - > C - > A - >などから、または後ろからスワイプ/スイングできるようにしたい。つまり、左にスワイプまたは右にスワイプして、フラグメントパネルを循環させます。
私はこれをすべて動作させています。しかし、私の問題は、AからAへの完全なサイクルをスワイプすると、TextViewフィールドへのすべての接続が機能しなくなったことです(これらのフラグメントには多数のライブ更新テキストフィールドがあります)。つまり、アップデートはもはや存在せず、私はもはやフィールドの変更を見ることができません。フィールドにsetText("foo")を追加できますが、新しい値が表示されなくなりました。フラグメントが表示されたら、もはやテキストビューの更新はありません。フラグメントの元のインスタンスがどこかで失われていて、表示されているインスタンスが新しいインスタンスであるかのように。 logcatの結果に基づいて、私はこれが起こっていると思います。実際、findFragmentByTagはです。常にが返されます。したがって、コードはすべてのスワイプに対して毎回新しいフラグメントを作成しています。

私はそれぞれのインスタンス(A、B、C)を保持したいので、状態を保持し、フラグメントをスワイプして進行中の更新を見ることができます。 はここで完全なコードファイルです:最初の

package com.company.myApp; 

import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.GestureDetector; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 

public class Fragment_ProgressBar extends Fragment { 
    final static String TAG = "Fragment_ProgressBar"; 
    final static String FRAGMENT_TAG_SUMMARY  = "Fragment_Summary"; 
    final static String FRAGMENT_TAG_PROGRESSBAR = "Fragment_ProgressBar"; 
    final static String FRAGMENT_TAG_TIME = "Fragment_Time"; 
    final static String DIRECTION_LEFT = "DIRECTION_LEFT"; 
    final static String DIRECTION_RIGHT = "DIRECTION_RIGHT"; 
    public final static String CURRENT_FRAGMENT = FRAGMENT_TAG_PROGRESSBAR; 
    final Fragment thisFragment = this; 

    public Fragment_ProgressBar(){} 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
          ViewGroup container, 
          Bundle savedInstanceState) { 

     final GestureDetector gesture = new GestureDetector(getActivity(), 
       new GestureDetector.SimpleOnGestureListener() { 

        @Override 
        public boolean onDown(MotionEvent e) { 
         return true; 
        } 

        @Override 
        public boolean onFling(MotionEvent event1, 
              MotionEvent event2, 
              float velocityX, 
              float velocityY) { 
         final int SWIPE_MIN_DISTANCE = 120; 
         final int SWIPE_MAX_OFF_PATH = 250; 
         final int SWIPE_THRESHOLD_VELOCITY = 200; 
         try { 
          if (Math.abs(event1.getY() - event2.getY()) > SWIPE_MAX_OFF_PATH) 
           return false; 
          if (event1.getX() - event2.getX() > SWIPE_MIN_DISTANCE 
            && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
           Log.i(TAG, "Right to Left"); 
           showFragment_RightToLeft(FRAGMENT_TAG_TIMECIRCLE); 
          } else if (event2.getX() - event1.getX() > SWIPE_MIN_DISTANCE 
            && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
           Log.i(TAG, "Left to Right"); 
           showFragment_LeftToRight(FRAGMENT_TAG_SUMMARY); 
          } 
         } catch (Exception e) { 
          // nothing 
         } 
         return super.onFling(event1, event2, velocityX, velocityY); 
        } 
       }); 

     View view = inflater.inflate(R.layout.fragment_progress_bar, container, false); 
     view.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return gesture.onTouchEvent(event); 
      } 
     }); 
     // Inflate the layout for this fragment 
     return view; 
    } 

    private Fragment getNewFragment(String name){ 
     Log.i(TAG,String.format("Fragment (%s) not found; creating new instance.", name)); 
     switch (name) { 
      case FRAGMENT_TAG_SUMMARY: 
       return new Fragment_Summary(); 
      case FRAGMENT_TAG_PROGRESSBAR: 
       return new Fragment_ProgressBar(); 
      case FRAGMENT_TAG_TIME: 
       return new Fragment_Time(); 
     } 
     return null; 
    } 

    private void showFragment_LeftToRight(String nextFragmentNameTag) 
    { 

     Fragment nextFragment = getChildFragmentManager().findFragmentByTag(nextFragmentNameTag); 
     if (nextFragment == null) 
      nextFragment = getNewFragment(nextFragmentNameTag); 
     if (nextFragment == null) 
      return; 

     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right); 
     ft.remove(thisFragment); 
     ft.add(R.id.overview_fragment_container, nextFragment, nextFragmentNameTag); 
     ft.addToBackStack(null); 
     ft.commit(); 
     getFragmentManager().executePendingTransactions(); 

    } 
    private void showFragment_RightToLeft(String nextFragmentNameTag) 
    { 
     Fragment nextFragment = getChildFragmentManager().findFragmentByTag(nextFragmentNameTag); 
     if (nextFragment == null) 
      nextFragment = getNewFragment(nextFragmentNameTag); 
     if (nextFragment == null) 
      return; 

     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.setCustomAnimations(R.animator.slide_in_right, R.animator.slide_out_left); 
     ft.replace(R.id.overview_fragment_container, nextFragment, nextFragmentNameTag); 
     ft.addToBackStack(null); 
     ft.commit(); 
     getFragmentManager().executePendingTransactions(); 

    } 

} 
+0

私は主なアクティビティにfindFragmentByTag()コールを入れようとしましたが、違いはありません。まだヌルです。 – Hephaestus

+1

なぜプライベートフラグメントマネージャーgetChildFragmentManager()でフラグメントを探していて、それをメインフラグメントマネージャーgetFragmentManager()で処理しているのですか?第2に、あなたが削除を呼び出して置き換えるときに、フラグメントがまだ残っているとどう思いますか? – Distjoy

+0

無知!答えは単純な無知です!私はちょうどgetChildManagerに変更しました。ありがとう! – Hephaestus

答えて

2

彼らはFragment_ProgressBarに子断片として接続されているかのようあなたが断片を探しているあなたがいるので、すべてのフラグメントは、まだ、活動のフラグメントマネージャによって管理されています間違った場所で断片を探している。

第2に、トランザクションの実行中にFragmentTransaction.remove()またはFragmentTransaction.replace()を呼び出すたびに、フラグメントマネージャから古いフラグメントを削除します。

新しいフラグメントを追加/再接続し、古いフラグメントをデタッチすることもお勧めします(フラグメントはUIから削除されますが、その状態はまだフラグメントマネージャによってアクティブに管理されています)。

+0

新しいフラグメントを追加して古いものを保存したい場合、正しい順序は何ですか?新しいフラグメントを追加する前に、古いフラグメントを 'remove'または' replace'する必要はありませんか? – Hephaestus

+1

'remove'を呼び出すか' replace'を使うと、フラグメントマネージャは古いものを保存しません(ただし、フラグメントインスタンスを保持しないと、スムーズなフローが得られません)。単に古いものを切り離してから、新しいものを追加するか、再追加してください。 – Distjoy

関連する問題