좋아, 누구나 쉽게 물어볼 수 있다고 믿을 수 없을만큼 간단하고 분명해야합니다. 나는 하루 동안 그것을 연구했고 대답을 찾을 수 없다. 이것이 어떻게 작동해야하는지에 대한 나의 전체적인 이해가 잘못되었을 수도 있지만, 여기에 내 문제가 있습니다.부모로부터 파편 방법에 접근하기 활동 :
는 TabsPagerAdapter
라는 FragmentStatePagerAdapter
통해 EnterCourseData
라고 I은 활동에서 실행 단편 2 개 탭 ParFragment
및 HandicapFragment
있다. 두 조각 모두 동일한 값을 표시하는 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) 포인터를 사용하여 메서드를 호출합니다.
내 생각에 결함이있는 곳과 정확하게이 문제를 해결하는 방법을 알려주십시오.
는 활동에 조각을 추가 할 때
당신은 나의 뜻에 있습니다! 물론 효과가있었습니다. 자, ... 조각 번호를 하드 코딩하는 것은 나쁜 형태로 간주됩니까? 그것은 작동하지만, 나는이 디자인으로 나쁜 길을 걸어 다녔던 것처럼 보인다. – ddk
무슨 뜻인지 잘 모르겠지만 하드 코딩 된 조각 번호가있는 문제는 예견 할 수 없습니다. 사실, ViewPager 내의 프래그먼트 식별자이므로 주위를 둘러 볼 방법이 없습니다. – Rafa