2012-09-26 7 views
3

조각 모음을 표시하기 위해 ViewPager를 사용하는 조각 활동이 있습니다. 프래그먼트 작업에는 클릭 할 때 현재 프래그먼트로 메시지를 보내어 내용을 새로 고침합니다. 프래그먼트의 뷰를 새로 고칠 수 없다는 것을 제외하고는 모든 것이 정상적으로 작동합니다 (현재/현재 프래그먼트 통신). 이 함수는 null을 반환하므로 getView()로 현재 뷰에 액세스 할 수 없습니다. 조각이 생성 된 후 (ViewCreated에서 호출 될 때) getView가 삭제 된 것 같습니다. 내가 여기서 뭔가를 놓치고 있니? 프래그먼트로 내용을 프로그래밍 방식으로 다시 그리게 만드는 방법은? 이것이 작동하는 유일한 방법은 단편이 상위 활동에서 작성된 경우입니다. 이렇게하려면 조각을 다시 제거하고 다시 추가해야합니까? 여기 버튼을 클릭 할 때 조각보기 새로 고침

코드이다

주요 활동

public class MainActivity extends FragmentActivity { 

    private MyAdapter mAdapter; 
    private static ViewPager mPager; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 
       setupViewPager(); 
     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
       getMenuInflater().inflate(R.menu.activity_main, menu); 
       return true; 
     } 

     @Override 
     public boolean onPrepareOptionsMenu(Menu menu) { 
       return super.onPrepareOptionsMenu(menu); 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
       switch (item.getItemId()) { 

       case R.id.menu_test: 
         updateFragment(); 
         return true; 

       default: return true; 
       } 
     } 

     private void updateFragment() { 
       for (int i=0; i< mAdapter.getCount(); i++) { 
         SampleFragment fragment = (SampleFragment) mAdapter.getItem(i); 
         fragment.update(); 
       } 
     } 

     private void setupViewPager() { 
       try { 
         mAdapter = new MyAdapter(getSupportFragmentManager()); 

         mPager = (ViewPager) findViewById(R.id.pager); 
         mPager.setAdapter(this.mAdapter); 

       } catch (Exception e) { 
         e.printStackTrace(); 
       } 
     } 

     public class MyAdapter extends FragmentPagerAdapter { 

       public MyAdapter(FragmentManager fm) { 
         super(fm); 
       } 

       @Override 
       public Fragment getItem(int position) { 
         SampleFragment fragment = new SampleFragment(position); 
         return fragment; 
       } 

       @Override 
       public int getCount() { 
         return 5; 
       } 
     } 
} 

및 프래그먼트 분류 :

public class SampleFragment extends Fragment{ 

     private int myPosition = -1; 

     public SampleFragment(int position) { 
       this.myPosition = position; 
     } 

     @Override 
     public void onAttach(Activity activity) { 
       super.onAttach(activity); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
       View view = inflater.inflate(R.layout.fragment, container, false); 
       update(view, "Updated from onCreateView"); 
       return view; 
     } 

     @Override 
     public void onActivityCreated(Bundle bundle) { 
       super.onActivityCreated(bundle); 
     } 

     @Override 
     public void onViewCreated(View view, Bundle savedInstanceState) { 
       super.onViewCreated(view, savedInstanceState); 

       view.findViewById(R.id.textTitle).setOnClickListener(myClickListener); 
     } 

     private OnClickListener myClickListener = new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
         switch (v.getId()) { 

         case R.id.textTitle: 
           break; 

         } 
       } 
     }; 

     public void update() { 
       update(getView(), "Updated from main"); 
     } 

     private void update(View view, String subtitleText) { 
       TextView title = (TextView) view.findViewById(R.id.textTitle); 
       TextView subtitle = (TextView) view.findViewById(R.id.textSubtitle); 

       title.setText("Fragment " + myPosition); 
       subtitle.setText(subtitleText); 
     } 
} 

오류라고 view.FindViewById (뷰가 null)에서 발생 주 활동의 메뉴 항목에서

+0

조각에서 수정하려는 레이아웃의 뷰를 캡처하거나 저장할 수 있습니까? 예 : TextView mTitle = (TextView) findById (R.id.title); 그런 다음 나중에보기의 텍스트를 편집하십시오. –

+0

벌써 시도했지만 레이아웃을 업데이트해야 할 때 null로 판명되었습니다. – user501223

+0

무슨 일이 일어나는지 설명하는 데 도움이되는 몇 가지 코드를 게시 할 수 있습니까? –

답변

4

ViewPager에서 조각을 참조하는 방법을 설명하는 this article을 살펴볼 수 있습니다.

페이지에 설명 된 두 가지 방법이 있습니다. 첫 번째는 FragmentManager를 사용하여 조각을 추가 할 때 태그를 설정하는 것입니다. 그런 다음 findFragmentByTag()을 사용하여 조각을 검색 할 수 있습니다. 그러나 FragmentPagerAdapter 또는 FragmentStatePagerAdapter를 사용하여이 작업을 수행하는 방법을 알지 못했습니다. 이러한 구현은 조각을 추가하기 때문에 발생합니다. 자신 만의 PagerAdapter 커스터마이징을 사용한다면이 방법이 유용 할 것입니다.

FragmentPagerAdapter 또는 FragmentStatePagerAdapter에서 작동하는 다른 방법은 getItem()destroyItem() 구현 내부에서 업데이트하는 모든 조각의지도를 유지하는 것입니다. 이 방법은 저에게 효과적입니다.

일단 현재 조각에 대한 참조가 있으면 조각에서 메서드를 호출하여보기를 새로 고칠 수 있습니다.

+0

두 번째 방법이 확실히 좋습니다. 감사! –

관련 문제