2013-12-15 2 views
1

좋아, 누구나 쉽게 물어볼 수 있다고 믿을 수 없을만큼 간단하고 분명해야합니다. 나는 하루 동안 그것을 연구했고 대답을 찾을 수 없다. 이것이 어떻게 작동해야하는지에 대한 나의 전체적인 이해가 잘못되었을 수도 있지만, 여기에 내 문제가 있습니다.부모로부터 파편 방법에 접근하기 활동 :

TabsPagerAdapter라는 FragmentStatePagerAdapter 통해 EnterCourseData라고 I은 활동에서 실행 단편 2 개 탭 ParFragmentHandicapFragment있다. 두 조각 모두 동일한 값을 표시하는 2 EditText보기를 보여 주며 두 조각 모두 EditText보기에서이 값을 가져 와서이 값을 저장하는 저장 버튼을 가지고 있습니다. 또한 단추는 EnterCourseData 활동에 값이 변경되었을 수 있음을 알리기 위해 콜백을 시작합니다. EnterCourseData 두 조각을 강제로 새 값으로 업데이트하려고합니다. 내 가정은이 시간 동안 두 탭이 존재하기 때문에 둘 다 액세스 가능하다는 것입니다. 내가 findFragmentByTag("ParFragment")을 사용하여 하나에 도착하려고 노력하고 있지만 null 값을 얻고 있습니다.

내가하고있는 일이 다른 방법으로 처리되는 것이 가장 좋으며, 내가하고있는 일을 해결하는 방법을 알려주십시오. 다음 코드는 여기에 ...이다 년대 TabsPagerAdapter :

public class TabsPagerAdapter extends FragmentStatePagerAdapter { 
    int courseNumber, teeNumber; 

    public TabsPagerAdapter(FragmentManager fm, int courseNumber, int teeNumber) { 
     super(fm); 
     this.courseNumber = courseNumber; 
     this.teeNumber = teeNumber; 
    } 

    @Override 
    public Fragment getItem(int index) { 

     switch (index) { 
     case 0: 
      // Par Entry activity 
      Fragment parFragment = new ParFragment(); 
      Bundle args = new Bundle(); 
      args.putInt(ParFragment.ARG_COURSE_NUMBER, courseNumber); 
      args.putInt(ParFragment.ARG_TEE_NUMBER, teeNumber); 
      parFragment.setArguments(args); 
      return parFragment; 
     case 1: 
      // Handicap Entry fragment activity 
      Fragment hcpFragment = new HandicapFragment(); 
      args = new Bundle(); 
      args.putInt(HandicapFragment.ARG_COURSE_NUMBER, courseNumber); 
      args.putInt(HandicapFragment.ARG_TEE_NUMBER, teeNumber); 
      hcpFragment.setArguments(args); 
      return hcpFragment; 
     } 

     return null; 
    } 

    @Override 
    public int getCount() { 
     // get item count - equal to number of tabs 
     return 2; 
    } 
} 

다음은이 (거의) 동일한 조각 중 하나입니다 :

public class ParFragment extends Fragment { 
    public static final String ARG_COURSE_NUMBER = "courseNumber", ARG_TEE_NUMBER = "teeNumber"; 
    Tee tee; 
    String courseName; 
    View rootView; 

    OnParSavedListener mCallback; 

    // Container Activity must implement this interface 
    public interface OnParSavedListener { 
     public void onParSaved(); 
    } 

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

     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception 
     try { 
      mCallback = (OnParSavedListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnParSavedListener"); 
     } 
    } 



    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     rootView = inflater.inflate(R.layout.fragment_par, container, false); 

     Button buttonSave = (Button) rootView.findViewById(R.id.savePars); 
     buttonSave.setOnClickListener(savePars); 

     Bundle args = getArguments(); 
     Course course = Global.getCourse(args.getInt(ARG_COURSE_NUMBER)); 
     courseName = course.getName(); 
     ((TextView) rootView.findViewById(R.id.display_course_name)).setText(course.getName()); 
     tee = course.getTee(args.getInt(ARG_TEE_NUMBER)); 
     ((TextView) rootView.findViewById(R.id.display_tee_name)).setText(tee.getTeeName()); 
     refreshParScreen(); 


     return rootView; 
    } 

    View.OnClickListener savePars = new View.OnClickListener() { 
     public void onClick(View v) { 
      tee.setSlope(Integer.parseInt(((EditText) rootView.findViewById(R.id.enter_tee_slope)).getText().toString())); 
      tee.setRating(Double.parseDouble(((EditText) rootView.findViewById(R.id.enter_tee_rating)).getText().toString())); 
      GolfTools.addUpdateCourse(rootView.getContext(), Global.getCourse(courseName)); 
      mCallback.onParSaved(); 
     } 
     }; 

     public void refreshParScreen(){ 
      ((TextView) rootView.findViewById(R.id.enter_tee_slope)).setText(Integer.toString(tee.getSlope())); 
      ((TextView) rootView.findViewById(R.id.enter_tee_rating)).setText(Double.toString(tee.getRating())); 

     } 
} 

을 여기에 활동의 대부분이다 :

public class EnterCourseData extends FragmentActivity implements ActionBar.TabListener, ParFragment.OnParSavedListener{ 


    private ViewPager viewPager; 
    private TabsPagerAdapter mAdapter; 
    private ActionBar actionBar; 
    // Tab titles 
    private String[] tabs = { "Pars", "Handicaps" }; 
    private int courseNumber, teeNumber; 

    public void onParSaved() { 
     // The user saved the Par sheet 
     // Refresh par and Handicap tabs 
     ParFragment parFrag = (ParFragment) getSupportFragmentManager().findFragmentByTag("ParFragment"); 

     if (parFrag != null) { 
      parFrag.refreshParScreen(); 
     } 
    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_enter_tees); 
     // Initialization 
     Intent mIntent = getIntent(); 
     courseNumber = mIntent.getIntExtra("courseNumber",0); 
     teeNumber = mIntent.getIntExtra("teeNumber",0); 

     viewPager = (ViewPager) findViewById(R.id.fragment_container); 
     actionBar = getActionBar(); 
     mAdapter = new TabsPagerAdapter(getSupportFragmentManager(), courseNumber, teeNumber); 

     viewPager.setAdapter(mAdapter); 
     actionBar.setHomeButtonEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);   

     // Adding Tabs 
     for (String tab_name : tabs) { 
      actionBar.addTab(actionBar.newTab().setText(tab_name) 
        .setTabListener(this)); 
     } 
     /** 
     * on swiping the viewPager make respective tab selected 
     * */ 
     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
    . 
    . 
    . 

을 프래그먼트에서 버튼을 누르고 난 후 프래그먼트 메서드를 호출하여 화면을 다시 채우고 싶습니다. 나는 ParFragment parFrag = (ParFragment) getSupportFragmentManager().findFragmentByTag("ParFragment");을 사용하고 널값을 얻습니다. "ParFragment"가 존재하는 이유는 이것이 우리가 여기에있는 방식이기 때문입니다. 내 이해는 1) 조각에 대한 포인터를 얻고 2) 포인터를 사용하여 메서드를 호출합니다.

내 생각에 결함이있는 곳과 정확하게이 문제를 해결하는 방법을 알려주십시오.

는 활동에 조각을 추가 할 때

답변

2

FragmentStatePagerAdapter 태그를 사용하지 않습니다 감사합니다. 그래서 findFragmentByTag이 null을 반환합니다.

조각을 얻으려면 instantiateItem 메서드를 사용해야합니다. 조각 # 0을 얻으려면.

ParFragment parFrag = (ParFragment) mAdapter.instantiateItem(viewPager, 0) 

this answer을 참조하십시오.

+0

당신은 나의 뜻에 있습니다! 물론 효과가있었습니다. 자, ... 조각 번호를 하드 코딩하는 것은 나쁜 형태로 간주됩니까? 그것은 작동하지만, 나는이 디자인으로 나쁜 길을 걸어 다녔던 것처럼 보인다. – ddk

+0

무슨 뜻인지 잘 모르겠지만 하드 코딩 된 조각 번호가있는 문제는 예견 할 수 없습니다. 사실, ViewPager 내의 프래그먼트 식별자이므로 주위를 둘러 볼 방법이 없습니다. – Rafa