2017-07-04 16 views
0

(タブ付き)フラグメントメソッドを呼び出して、データをアクティビティにしたいと考えています。親アクティビティからフラグメントメソッドを呼び出す

  1. は私が
    • thisを読んしかし、私はthis
      • を試してみました。しかし、それは法的な表現
      • ではありませんので、私の活動はすでにフラグメントのクラスを実装している
    • nullオブジェクト参照を取得します
  2. タブは私がFragmentManagerが、運を試してみました

     @Override 
         public void onTabUnselected(TabLayout.Tab tab) { 
          if (tab.getText().equals("Owner")) { 
           //invoking method here 
           Log.i(TAG, tab.getText().toString() + " unselected"); 
          } 
    

    getDetails()方法により活動に細部に送信する最初のタブの形をしたい変更されたので

、助けてください!

編集 -これは私が非常にフラグメントに断片ロジックを維持することをお勧め

public Bundle getData() { 
    Bundle bundle = new Bundle(); 
    bundle.putString("area", area); 
    bundle.putString("villageTown", villageTown.getSelectedItem().toString()); 
    bundle.putString("ownerName", ownerName); 
    bundle.putString("fatherHusbandName", fatherHusbandName); 
    bundle.putString("category", category.getSelectedItem().toString()); 
    bundle.putString("address", address); 
    bundle.putString("mobileNumber", mobileNumber); 
    bundle.putString("telephoneNumber", telephoneNumber); 


    return bundle; 
} 
+0

リスナーを試しましたか? Interfaceを作成するのと同じように、Fragmentクラスで実装し、そのメソッドをActivityから呼び出しますか? –

+1

汚い方法: '((YourActivity)getActivity())。someMethodInActivity() ' – azizbekian

+0

@AnandSinghこれは2番目のリンクで与えられているもので、私のアクティビティはすでにフラグメントのメソッドを実装しているので、フラグメントのアクティビティに実装することはできません。 –

答えて

0
@Override 
     public void onTabUnselected(TabLayout.Tab tab) { 
      if (tab.getText().toString().equalsIgnoreCase("owner")) { 
       OwnerForm frag = (OwnerForm) getSupportFragmentManager().getFragments().get(0); 
       bundle = frag.getData(); 
      } 

      Log.i(TAG, tab.getText().toString() + " says hi"); //test statement 
     } 

は、私はあなたがnullオブジェクトエラーが発生getFragmentById()を使用する必要はありませんのでFragmentManagerは、すべてのアクティブなフラグメントのリストを保持して知りませんでした、私のためのトリックを行いました。

0

を呼び出したいメソッドです。アクティビティーからクラスを呼び出すフラグメントは、インターフェースのような多くの方法で行うことができます。しかし、フラグメントのメソッドを呼び出すアクティビティは問題を引き起こします。特に、画面に表示されないフラグメントのメソッドに到達しようとすると、

フォームが満たされたときにフラグメントから共有設定にデータを書き込むことができます。また、onTabUnselectedを呼び出すと、アクティビティの共有プリファレンスからデータを読み取ることができます。私はそれが素晴らしい解決策ではないことを認めます。私はあなたの問題を正しく理解することを願っています。

+0

ええ、私は完全に理解していますが、メソッドはゲッターのようなものです(編集参照) –

+0

さらに、私は理解している限り、フラグメント内で呼び出すことはできません –

1

TabにバインドされたViewPagerを使用しているとします。まず、ViewPagerで使用するフラグメントのインスタンスを保持する必要があります。

この回答でViewPagerで使用するフラグメントインスタンスを取得する方法について説明しました。 https://stackoverflow.com/a/39274141/1559852

問題のために別のonPageChangeListener実装が必要です。 lastSelectedPositionViewPagerのままにして、ページを選択した後でデータをアクティビティに送信し、lastSelectedPositionを更新する必要があります。ここにその例があります

int lastSelectedPosition = viewPager.getCurrentItem(); 

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      // Here's your instance 
      YourFragment fragment =(YourFragment)yourPagerAdapter.getRegisteredFragment(lastSelectedPosition); 
      // Here're your details. You can update. 
      YourDetails details = yourFragment.getDetils(); 
      lastSelectedPosition = position; 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 

私はこれがあなたを助けてくれることを願っています。がんばろう。使用getFragments().get()

+0

ありがとう:)しかし、私はそれを見つけることができなかった "getRegisteredFragment"です –

+0

私はリンクで説明したようにカスタムアダプタを作成する必要があります – savepopulation

+0

私は考えましたとにかくありがとうございました。 –

関連する問題