Передача данных из одного фрагмента в следующий фрагмент в Android
В одном из моих проектов я использую 2 фрагмента. Один фрагмент отображает список элементов. Поэтому я хочу, чтобы в первом фрагменте была выбрана тема, детали должны быть изменены в другом фрагменте. Данные я могу передать из одного фрагмента. к другому, но представление не меняется. В каком методе я должен реализовать представление второго фрагмента, чтобы оно могло измениться соответственно. Пожалуйста, дайте мне хороший учебник или пример для них.
Здесь я должен разработать один пример для Android, я должен запустить приложение, чтобы отображаемое имя категории было хорошо отображено в горизонтальном списке моего первого фрагмента. Мне нужно щелкнуть любую категорию, чтобы узнать, как передать имя категории во втором фрагменте. Пожалуйста, дайте мне решение для этой проблемы.
Я использовал ниже код:
public class Home extends FragmentActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
1-й фрагмент кода:
public class MainActivity extends Fragment {
static final String URL = "http://dev2.mercuryminds.com/webservices/new_feed_articls.xml";
static String KEY_CATEGORY = "Categories";
static final String KEY_TITLE = "Category";
LazyAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_main,
container, false);
final ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_TITLE);
// looping through all song nodes <song>
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String> ();
Element e = (Element) nl.item(i);
map.put( KEY_TITLE,((Element)nl.item(i)).getAttribute("name"));
// map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
songsList.add(map);
}
HorizontalListView list = (HorizontalListView) view.findViewById(R.id.listView1);
adapter = new LazyAdapter(getActivity(), songsList);
list.setAdapter(adapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
HashMap<String, String> map = songsList.get(position);
Intent in = new Intent();
in.setClass(getActivity(), SubCate.class);
// in.putExtra(KEY_TITLE, map.get(KEY_TITLE));
startActivity(in);
}
});
return view;
}}
Как я могу отобразить название категории на 2-й деятельности... пожалуйста, дайте мне код для этих...
РЕДАКТИРОВАТЬ:
Привет, я изменил код, как в моей первой деятельности:
HashMap<String, String> map = songsList.get(position);
SubCate frag = (SubCate) getFragmentManager().findFragmentById(R.id.frag_2);
if (frag != null && frag.isInLayout()) {
frag.setText(getCapt(map));
}
}
private String getCapt(HashMap<String, String> map) {
if (map.containsValue("notchbolly")) {
return "dadad";
}
return "veeman";
на следующую деятельность:
public void setText(String item) {
TextView view = (TextView) getView().findViewById(R.id.cate);
view.setText(item);
}
он проснулся хорошо, в то время как непосредственно упоминается имя в if (map.containsValue("notchbolly")). Но мне нужно отображать имя без упоминания имени напрямую. Если мне нужно щелкнуть любую категорию, это означает, что название категории отображается в следующем фрагменте. Как я могу сделать?????
2 ответа
Используя интерфейсный метод, мы можем передавать данные между фрагментами
Во фрагменте A создайте интерфейс и отправьте данные этому интерфейсу, внедрите этот метод интерфейса во фрагмент B и получите необходимые данные.
следующий код полезен для вас
Код во фрагменте A:
public class FragmentA extends Fragment {
// interface method
public InterfaceDataCommunicatorBetweenfragmentAToFragmentB iInterfaceDataCommunicatorBetweenfragmentAToFragmentB;
// Data to send
String mDataString;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// use this line where u send data
iInterfaceDataCommunicatorBetweenfragmentAToFragmentB.upDatedData(mDataString);
View view = inflater.inflate(R.layout.sent_box, container, false);
return view ;
}
/**
* Interface method to send data to fragmentB
*
*/
public interface InterfaceDataCommunicatorBetweenfragmentAToFragmentB {
public void upDatedData(String data);
}
}
Код во фрагменте B:
class FragmentB extends Fragment implements InterfaceDataCommunicatorBetweenfragmentAToFragmentB {
// interface method
public InterfaceDataCommunicatorBetweenfragmentAToFragmentB iInterfaceDataCommunicatorBetweenfragmentAToFragmentB;
// fragmentA data
String mgetUpdatedData
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.get_box, container, false);
return view ;
}
/**
* Interface method coming from fragment a to fragmentB after implement interface in fragmentB
*/
public void upDatedData(String data) {
this.mgetUpdatedData = data;
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
try {
iInterfaceDataCommunicatorBetweenfragmentAToFragmentB = (InterfaceDataCommunicatorBetweenfragmentAToFragmentB ) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement interface");
}
}
Вам необходимо реализовать интерфейсный механизм.
Обратитесь по следующим ссылкам для получения дополнительной информации.
http://developer.android.com/guide/components/fragments.html http://developer.android.com/training/basics/fragments/communicating.html