0

我有一个包含两个片段的活动(都是动态创建的),其中一个是 ListFragment。我在活动中实现了一个 onListItemClick 处理程序。单击一个项目时,我想用其他片段替换两个片段,并填充一个 TextView。但是,在替换片段后,我似乎无法获得我需要在新的详细信息片段中操作 TextView 的 View 对象——它返回 null。这是一些相关代码(onListItemSelected 是在主活动中处理 onListItemClick 的处理程序)。

@Override
public void onListItemSelected(int index) {
    inflateCheckinFragment();
    FragmentManager fm = getFragmentManager();

    FragmentTransaction fragmentTransaction = fm.beginTransaction();
        cif = new checkInFragment();
        fragmentTransaction.replace(R.id.action_container, cif, "ACTIONS");
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit()

    FragmentTransaction fragmentTransaction2 = fm.beginTransaction();
        gdf = new GeolocDetailsFragment();
        fragmentTransaction2.replace(R.id.fragment_container, gdf, "DETAILS");
        fragmentTransaction2.addToBackStack(null);
        fragmentTransaction2.commit();

    View gdfView = gdf.getView();

    TextView tv = (TextView)  gdfView.findViewById(R.id.textPOI);
    tv.setText(printPOI(poiList.get(index)));
}
4

2 回答 2

1

我最终只是在 onListItemSelected 方法中设置了数据。selectedPOI 是私有类成员。

public void onListItemSelected(int index) {
        FragmentManager fm = getFragmentManager();

        FragmentTransaction fragmentTransaction = fm.beginTransaction();
        fragmentTransaction.replace(R.id.action_container, cif, TAG_CHECKIN);
        fragmentTransaction.replace(R.id.fragment_container, gdf, TAG_DETAILS);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

        selectedPOI = poiList.get(index);
    }

然后在 GeolocDetailsFragment 类中,我在 Fragment 的 onCreateView 方法中设置了要在 Activity 中调用的处理程序来设置 TextView 的值。

public class GeolocDetailsFragment extends Fragment {
    private TextSetter textSetter;

    public interface TextSetter {
        public String getActivityText();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.geoloc_details_fragment, container, false);
        TextView detailsText = (TextView) view.findViewById(R.id.textPOI);

        detailsText.setText(textSetter.getActivityText());

        return view;
    }

    public void onAttach(Activity activity) {

        super.onAttach(activity);

        try {
            textSetter = (TextSetter) activity;
        }
        catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnGetPOIListener");
        }
    }

}

最后,我在主活动中实现了 getActivityText() 以获取要传递给 TextView 的字符串。

    @Override
    public String getActivityText() {

        return printPOI(selectedPOI);
    }
于 2012-11-21T01:58:28.347 回答
0

您应该以这样的方式使用 Fragments,在您的 Fragment 中TextView公开有助于Activity直接访问它,从而更改值。

Class GeolocDetailsFragment extends Fragments{

public TextView tv;

onCreateView(){

    tv= (TextView)  rootView.findViewById(R.id.textPOI);

    }


}

//在你的活动中

@Override
public void onListItemSelected(int index) {

      gdf = new GeolocDetailsFragment();
      gdf.tv.setText(printPOI(poiList.get(index)));

}
于 2012-11-20T12:18:38.887 回答