2016-11-29 6 views
0

Я использую интерфейс для передачи данных из фрагмента в родительскую активность. Однако, после реализации интерфейса в Activity, вводится циклическое наследование. Пожалуйста, предложите возможные решения?Циклическое наследование в реализации реализации интерфейса Фрагмента

Существенными биты кода:

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

переместите интерфейс в свой собственный блок компиляции (aks отдельный файл) – Blackbelt

ответ

0

Firsly в вашем фрагменте реализации метода onDetach, внутри четкая ссылка на dataListener

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

Вы сохраняете ссылку деятельности (как dataListener ваша деятельность литой в интерфейс), вам нужно очистить это, когда больше не нужно.

И еще одна вещь, пожалуйста, не делайте фрагменты и адаптеры как внутренние классы :)

Смежные вопросы