2016-11-29 68 views
0

我正在使用接口将数据从片段传递到父活动。但是,在Activity中实现接口后,引入了循环继承。请提出可能的解决方案代码活动中实现Fragment接口的循环继承

基本位:实现方法onDetach, 明确提到里面的DataListener

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

Firsly在片段

@Override 
public void onDetach() { 
    super.onDetach();   
    dataListener = null; 
} 

你存储参考活动(如的DataListener是你的活动铸造到接口),你需要清除不再需要的时候。

还有一件事请不要让片段和适配器作为内部类:)