2016-11-29 15 views
0

フラグメントを親アクティビティに渡すためのインターフェイスを使用しています。ただし、アクティビティでインターフェイスを実装した後は、循環継承が導入されます。可能な解決策を提案してください。コードのフラグメントのインターフェイスを実装するアクティビティの循環継承

不可欠ビット:あなたのフラグメントでFirsly

public class FirstActivity extends AppCompatActivity implements FirstActivity.FirstFragment.PassSituationData { 

    ViewPager viewPager; 
    TabLayout tabLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     //....... 

     viewPager = (ViewPager) findViewById(R.id.viewpager); 
     setupViewPager(viewPager); 

     tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(viewPager); 
    } 

    private void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     adapter.addFragment(new SecondFragment(), "A"); 
     adapter.addFragment(new FirstFragment(), "B"); 
     viewPager.setAdapter(adapter); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

    @Override 
    public void onDataPass(String nameText) { 
     Log.d("data",nameText); 
    } 

    class ViewPagerAdapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 

     public ViewPagerAdapter(FragmentManager manager) { 
      super(manager); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return mFragmentList.get(position); 
     } 

     @Override 
     public int getCount() { 
      return mFragmentList.size(); 
     } 

     public void addFragment(Fragment fragment, String title) { 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 
     } 

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


    public static class SecondFragment extends Fragment { 

     public SecondFragment() { 
      // Required empty public constructor 
     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      // Inflate the layout for this fragment 
      View rootView = inflater.inflate(R.layout.fragment_action, container, false); 

      return rootView; 
     } 

    } 

    public static class FirstFragment extends Fragment { 

     PassSituationData dataListener; 


     public FirstFragment() { 
      // Required empty public constructor 
     } 

     public interface PassSituationData { 
      public void onDataPass(String nameText); 
     } 


     @Override 
     public void onAttach(Activity a) { 
      super.onAttach(a); 
      try { 
       dataListener = (PassSituationData) a; 
      } catch (ClassCastException e) { 
       throw new ClassCastException(a.toString() + " must implement PassSituationData"); 
      } 
     } 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      // Inflate the layout for this fragment 
      View rootView = inflater.inflate(R.layout.fragment_situation, container, false); 

      return rootView; 
     } 


     @Override 
     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      if (requestCode == Constants.SITUATION_REQUEST_CODE) { 
       if (data != null) { 
        String nameText = data.getStringExtra("name"); 
        dataListener.onDataPass(nameText); 
       } 
      } 
     } 
    } 

} 
+0

正確なエラーは何ですか? – Blackbelt

+0

'com.example.FirstActivity'を含む循環継承 –

+1

インタフェースを独自のコンパイル単位で移動します(別のファイルを作成します) – Blackbelt

答えて

0

dataListenerに明確な参照内のメソッドonDetach、 を実装

あなたは活動への参照を格納している
@Override 
public void onDetach() { 
    super.onDetach();   
    dataListener = null; 
} 

は(dataListenerは、あなたの活動であるとして、インタフェースにキャストされている)、不要になったときにそれをクリアする必要があります。

もう1つのことは、フラグメントとアダプタを内部クラスとして作成しないでください:)

関連する問題