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();
}
}
私は主なアクティビティにfindFragmentByTag()コールを入れようとしましたが、違いはありません。まだヌルです。 – Hephaestus
なぜプライベートフラグメントマネージャーgetChildFragmentManager()でフラグメントを探していて、それをメインフラグメントマネージャーgetFragmentManager()で処理しているのですか?第2に、あなたが削除を呼び出して置き換えるときに、フラグメントがまだ残っているとどう思いますか? – Distjoy
無知!答えは単純な無知です!私はちょうどgetChildManagerに変更しました。ありがとう! – Hephaestus