2016-01-20 1 views
1

У меня проблема с использованием Butterknife libray. Существует у меня есть SearchActivity.class использовать ViewPager с 3 фрагмента в FragmentSearchAdapter:Butterknife view in Fragment является пустой ссылкой, если звонок из родительской активности

SearchActivity.class

mAdapter = new FragmentSearchAdapter(getSupportFragmentManager(), SearchActivity.this); 
    mAdapter.addFragment("search histori"); 
    mAdapter.addFragment("search query"); 
    mAdapter.addFragment("search result"); 
     mPager.setAdapter(mAdapter); 

    mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     public void onPageSelected(int currentIndex) { 
      if(currentIndex==2) { 
       SearchResultFragment SearchResultFragment = (SearchResultFragment) mAdapter.getItem(2); 

       if (SearchResultFragment != null) { 
        SearchResultFragment.setDescription("Text 1","Text 2"); 
       } 
      } 
     } 

     public void onPageScrolled(int arg0, float arg1, int arg2) { } 

     public void onPageScrollStateChanged(int arg0) { } 
    }); 

FragmentSearchAdapter.class

@Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       SearchHistoryFragment search_histori = new SearchHistoryFragment(); 
       return search_histori; 
      case 1: 
       SearchQueryFragment search_query = new SearchQueryFragment(); 
       return search_query; 
      case 2: 
       SearchResultFragment search_result = new SearchResultFragment(); 
       return search_result; 
     } 
     return null; 
    } 

Где один фрагмент SearchResultFragment. Класс

public class SearchResultFragment extends Fragment { 

    @Bind(R.id.text1) 
    TextView text1; 
    @Bind(R.id.text2) 
    TextView text2; 
    private String page_index; 
    private PageAlquranActivity activity; 

    public SearchResultFragment() { 
    } 

    public static SearchResultFragment newInstance(int page_index) { 
     SearchResultFragment fragment = new SearchResultFragment(); 
     Bundle args = new Bundle(); 
     args.putString(Variabel.page_index, String.valueOf(page_index)); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      page_index = getArguments().getString(Variabel.page_index); 
     } 
     activity = (PageAlquranActivity) getActivity(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_search_result, container, false); 
     ButterKnife.bind(this, v); 
     return v; 
    } 

    public void setDescription(String s1, String s2) { 
     text1.setText(s1); 
     text2.setText(s2); 
    } 

    @Override 
    public void onAttach(Context context) {super.onAttach(context);} 

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

} 

Моей проблема: когда вызов метод SearchResultFragment.setDescription("Text 1","Text 2"); из SearchActivity, я получаю сообщение об ошибке:

нулевого объект ссылочного

каждого TextView. Эта ошибка, если использовать нож для масла, но если нет, то это работа, если я объявляю Посмотреть, как это:

text1 = rootView.findViewById(R.id.text1); 
text2 = rootView.findViewById(R.id.text2); 

в onCreateView.

так как его решить? Извините за мой английский. Благодарю.

+0

Вы пробовали добавив '@ Nullable' аннотацию раз перед' @ Bind'? –

+0

У меня такая же проблема (каждый введенный вид определенного фрагмента становится нулевым после изменения страницы). ** Вы нашли какое-либо решение? ** – iroyo

ответ

0

@AmayDiam Вам необходимо связать ButterKnife снова в вызываемом методе. Пройдите по зависимости для привязки - вид фрагмента из OnPageChangeListener

SearchActivity.class

mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
public void onPageSelected(int currentIndex) 
{ 
    if(currentIndex==2) 
    { 
     SearchResultFragment SearchResultFragment = (SearchResultFragment) mAdapter.getItem(2); 

     if (SearchResultFragment != null) 
     { 
      SearchResultFragment.setDescription(mPager.getChildAt(currentIndex)"Text 1","Text 2"); 
     } 
     } 
    } 

    public void onPageScrolled(int arg0, float arg1, int arg2) { } 

    public void onPageScrollStateChanged(int arg0) { } 
}); 

SearchResultFragment.Class

public void setDescription(View view,String s1, String s2) 
{ 
    ButterKnife.bind(this, view); 
    // 
    text1.setText(s1); 
    text2.setText(s2); 
} 
0

Имел подобный вопрос тоже, только потому, что я 'добавили butterknife из управления зависимостями Android Studio, а не с помощью копирующих градир линий с сайта Butterknife. Так что я должен был добавить compile 'com.jakewharton:butterknife:8.5.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' вместо того, чтобы просто compile 'com.jakewharton:butterknife:8.5.1'