1

アクティビティ(Firebaseからのデータを取得)から別のフラグメントにデータを送信しようとしています。 Firebase上でデータを変更しても、アクティビティが作成されている間は最初の試行では変更されません。最初の試行で、メソッドのpassDataToInfoFragmentとpassDataToRanklistFragmentのフラグメントは常にNULLです。私は理由が分からないので、私は助けが必要です。私のフラグメントがインスタンス化されないのはなぜですか?フラグメントアクティビティのアクティビティ

GroupDetailFragmentCommunication:

public interface GroupDetailFragmentCommunication { 
 
    public void passDataToInfoFragment(PublicGroup group); 
 
    public void passDataToRanklistFragment(PublicGroup group); 
 
}

GroupDetailActivity:

public class GroupDetailActivity extends AppCompatActivity implements GroupDetailFragmentCommunication{ 
 

 
    private FirebaseAuth auth; 
 
    private FirebaseDatabase database; 
 
    private DatabaseReference reference; 
 
    private GroupDetailPagerAdapter adapter; 
 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_group_detail); 
 
     this.initFirebase(); 
 
     this.setUpToolbar(); 
 
     this.setUpTabLayout(); 
 
     this.getPublicGroup(); 
 
    } 
 

 
    public void initFirebase() { 
 
     auth = FirebaseAuth.getInstance(); 
 
     database = FirebaseDatabase.getInstance(); 
 
     reference = database.getReference(); 
 
    } 
 

 
    public void setUpToolbar() { 
 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
 
     toolbar.setTitle("Details"); 
 
     setSupportActionBar(toolbar); 
 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
 
    } 
 

 
    public void setUpTabLayout() { 
 
     TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
 
     ArrayList<String> tabs = new ArrayList<>(); 
 
     tabs.add("Info"); 
 
     tabs.add("Rank"); 
 

 
     final ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager); 
 
     this.adapter = new GroupDetailPagerAdapter(getSupportFragmentManager(), tabs); 
 
     viewPager.setAdapter(adapter); 
 
     tabLayout.setupWithViewPager(viewPager); 
 
    } 
 

 
    public void getPublicGroup() { 
 
      reference.child("groups").child("public").addValueEventListener(new ValueEventListener() { 
 
      @Override 
 
      public void onDataChange(DataSnapshot snapshot) { 
 
       PublicGroup pg = snapshot.getValue(PublicGroup.class); 
 
       if (pg != null) { 
 
        pg.setKey(snapshot.getKey()); 
 
        passDataToInfoFragment(pg); 
 
        passDataToRanklistFragment(pg); 
 
       } 
 
      } 
 

 
      @Override 
 
      public void onCancelled(DatabaseError databaseError) { 
 
      
 
      } 
 
     }); 
 
    } 
 

 

 
    @Override 
 
    public void passDataToInfoFragment(PublicGroup group) { 
 
     InfoFragment fragment = (InfoFragment) this.adapter.getFragment(0); 
 
     if (fragment != null) { 
 
      fragment.fragmentCommunication(group); 
 
     } else { 
 
      Log.i("Bla", "Fragment 1 is not instantiated"); 
 
     } 
 
    } 
 
s 
 
    @Override 
 
    public void passDataToRanklistFragment(PublicGroup group) { 
 
     RanklistFragment fragment = (RanklistFragment) this.adapter.getFragment(1); 
 
     if (fragment != null) { 
 
      fragment.fragmentCommunication(group); 
 
     } else { 
 
      Log.i("Bla", "Fragment 2 is not instantiated"); 
 
     } 
 
    } 
 

 

 
}

GroupDetailPagerAdapter:あなたのコードでチラッ後

public class GroupDetailPagerAdapter extends FragmentStatePagerAdapter { 
 
    private SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); 
 
    private ArrayList<String> tabHeader; 
 

 
    public GroupDetailPagerAdapter(FragmentManager fm, ArrayList<String> tabHeader) { 
 
     super(fm); 
 
     this.tabHeader = tabHeader; 
 
    } 
 

 
    @Override 
 
    public Fragment getItem(int position) { 
 

 
     switch (position) { 
 
      case 0: 
 
       Fragment infoTab = new InfoFragment(); 
 
       return infoTab; 
 
      case 1: 
 
       Fragment ranklistTab = new RanklistFragment(); 
 
       return ranklistTab; 
 
      default: 
 
       return null; 
 
     } 
 
    } 
 

 
    } 
 

 
    @Override 
 
    public Object instantiateItem(ViewGroup container, int position) { 
 
     Fragment fragment = (Fragment) super.instantiateItem(container, position); 
 
     registeredFragments.put(position, fragment); 
 
     return fragment; 
 
    } 
 

 
    @Override 
 
    public void destroyItem(ViewGroup container, int position, Object object) { 
 
     registeredFragments.remove(position); 
 
     super.destroyItem(container, position, object); 
 
    } 
 

 
    public Fragment getFragment(int position) { 
 
     return registeredFragments.get(position); 
 
    } 
 

 
    @Override 
 
    public CharSequence getPageTitle(int position) { 
 
     return tabHeader.get(position); 
 
    } 
 
}

答えて

0

アダプタからフラグメントインスタンスを取得するには、getFragmentではなくinstantiateItem(passData ...メソッド)を呼び出します。

instantiateItemを呼び出すと、アダプタが参照しているフラグメントが取得されます。 instantiateItemを複数回呼び出すことについて心配する必要はありません。すでにインスタンス化されている場合は、参照を取得するだけです。

これらの参照は更新されずにアダプタによって交換される可能性があるため、アダプタ内のフラグメントに対する独自の参照は維持しないでください。

+1

Thxと呼ばれるようになって、今それは動作します! –

1

私はいくつかの疑惑があります。 - > OnDataChangeの(

  • あなたはブレークポイントgetPublicGroupを()を設定しようとしたことがありDataSnapshotスナップショット)メソッド? pgがヌルの場合は、「通過」メソッドが呼び出されません。

そうでない場合は、それはあなたがのonCreate()親アクティビティのthis.getPublicGroup()を呼び出すときに、あなたの破片が完全にインスタンス化されていない場合があります。

  • あなたが代わりにあなたの親アクティビティのonResume()メソッドに次の行を移動しようとすることができ、このヘルプのでしょうか?
+0

渡すメソッドが呼び出されるので、pgは!= nullです。 this.getPublicGroup()をonResumeに移動しようとしましたが、同じ問題です。 Log.i( "Bla"、 "フラグメント1はインスタンス化されていません"); Log.i( "Bla"、 "フラグメント2はインスタンス化されていません")。ウルの助けのために –

関連する問題