Вызов одного фрагмента из другого
Вызов одного фрагмента из другого
Доброго времени суток!
Вернулся к проблеме, которую всё-таки необходимо решить - не могу организовать замещение одного фрагмента другим.
Суть задачи: Есть активити, которое по умолчанию загружает некий фрагмент, в котором, в свою очередь, имеются кнопки. Нажатие на любую из этих кнопок по умолчанию должно приводить к замещению существующего фрагмента в контейнере на другой.
Для решения данной задачи хочу реализовать достаточно простой метод - передать данные из фрагмента в активити с помощью onAttach и затем уже из активити с помощью findViewById (если это возможно) вызвать новый фрагмент. Подскажите пожалуйста, возможно ли вообще это и, в частности, выбранным мною способом? Если же да - то я совершенно не могу понять, какие же данные передавать в активити в данном случае и как вызывать, соответственно, по этим данным другой фрагмент.
Вернулся к проблеме, которую всё-таки необходимо решить - не могу организовать замещение одного фрагмента другим.
Суть задачи: Есть активити, которое по умолчанию загружает некий фрагмент, в котором, в свою очередь, имеются кнопки. Нажатие на любую из этих кнопок по умолчанию должно приводить к замещению существующего фрагмента в контейнере на другой.
Для решения данной задачи хочу реализовать достаточно простой метод - передать данные из фрагмента в активити с помощью onAttach и затем уже из активити с помощью findViewById (если это возможно) вызвать новый фрагмент. Подскажите пожалуйста, возможно ли вообще это и, в частности, выбранным мною способом? Если же да - то я совершенно не могу понять, какие же данные передавать в активити в данном случае и как вызывать, соответственно, по этим данным другой фрагмент.
Re: Вызов одного фрагмента из другого
Похоже на ViewPager попробуй посмотреть урок 125!?
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Вызов одного фрагмента из другого
Именно этим уроком я руководствовался, пытаясь организовать данную операцию... Меня интересует лишь то, какие же данные из фрагмента в активити пересылать, чтобы активити уже заменила существующий фрагмент требуемым? Не хватает мне знаний на это пока...Mikhail_dev писал(а):http://startandroid.ru/ru/uroki/vse-uro ... ivity.html
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Вызов одного фрагмента из другого
В уроке написано как из фрагмента вызвать метод активности, где вы вольны делать что угодно. В примере метод someEvent принимает от фрагмента какой-то текст. Поставьте туда не текст к примеру, а int, и передавайте тег фрагмента. Дальше в активности, в этом методе по полученному тегу уже создавайте необходимый фрагмент
Re: Вызов одного фрагмента из другого
Спасибо большое за подробное разъяснение. Похоже логику понял.Mikhail_dev писал(а):В уроке написано как из фрагмента вызвать метод активности, где вы вольны делать что угодно. В примере метод someEvent принимает от фрагмента какой-то текст. Поставьте туда не текст к примеру, а int, и передавайте тег фрагмента. Дальше в активности, в этом методе по полученному тегу уже создавайте необходимый фрагмент
Привел всё к someEvent(int s). При нажатии на кнопку для вызова первого фрагмента передаю someEventListener.someEvent(1);
В активити же в реализации одноимённого метода пишу:
public void someEvent(int s) {
if (s != 1) {
Fragment frag2 = new Info();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.frag_field, frag2);
ft.commit();
}
}
Сейчас у меня Eclipse при запуске программы ругается на строку во фрагменте:
throw new ClassCastException(activity.toString());
Как я понял так реализовывать задуманный метод нельзя... Мне, конечно, очень стыдно, но я совершенно немогу понять, что при реализации в активити метода findFragmentByTag(String tag) представлять тегом фрагмента и, соответственно, что сюда из фрагмента передавать?
Re: Вызов одного фрагмента из другого
Ребят, совсем запутался... Помогите, пожалуйста, всё же решить эту проблемку...
Вот код во фрагменте, из которого вызываю другой фрагмент:
Вот код активити:
После попытки запустить выпадает ошибка... в строке 30 фрагмента, как я понимаю:
Вот код во фрагменте, из которого вызываю другой фрагмент:
Код: Выделить всё
package com.example.friends_home;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
public class Primary extends Fragment implements OnClickListener {
ImageButton btn_list;
ImageButton btn_add;
ImageButton btn_info;
public interface onSomeEventListener {
public void someEvent(int s);
}
onSomeEventListener someEventListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
someEventListener = (onSomeEventListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString());
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.primary, container, false);
//находим элементы
btn_list = (ImageButton) v.findViewById(R.id.btn_list);
btn_list.setOnClickListener(this);
btn_add = (ImageButton) v.findViewById(R.id.btn_add);
btn_add.setOnClickListener(this);
btn_info = (ImageButton) v.findViewById(R.id.btn_info);
btn_info.setOnClickListener(this);
return v;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_info:
someEventListener.someEvent(R.id.InfoFrag);
break;
}
return;
}
}Код: Выделить всё
package com.example.friends_home;
import java.lang.reflect.Field;
import android.support.v7.app.ActionBarActivity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewConfiguration;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment frag1 = new Primary();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.frag_field, frag1);
ft.commit();
//Закрепляем меню в ActionBar
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception ex) {
// Ignore
}
}
public void someEvent(int s) {
if (s == R.id.InfoFrag) {
Fragment frag2 = new Info();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.frag_field, frag2);
ft.commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.info_menu) {
Fragment frag2 = new Info();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.frag_field, frag2);
ft.commit();
}
if (id == R.id.exit_menu) {
finish();
}
return super.onOptionsItemSelected(item);
}
}Код: Выделить всё
throw new ClassCastException(activity.toString());Re: Вызов одного фрагмента из другого
Тебе потому никто не отвечает, потому что все забодались уже! Лог выкладывать надо, экстрасенсов нету гадать.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Вызов одного фрагмента из другого
Код: Выделить всё
04-07 19:46:42.329: E/AndroidRuntime(29792): FATAL EXCEPTION: main
04-07 19:46:42.329: E/AndroidRuntime(29792): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.friends_home/com.example.friends_home.MainActivity}: java.lang.ClassCastException: com.example.friends_home.MainActivity@41799cc0
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2121)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2146)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.app.ActivityThread.access$700(ActivityThread.java:140)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1238)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.os.Handler.dispatchMessage(Handler.java:99)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.os.Looper.loop(Looper.java:137)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.app.ActivityThread.main(ActivityThread.java:4944)
04-07 19:46:42.329: E/AndroidRuntime(29792): at java.lang.reflect.Method.invokeNative(Native Method)
04-07 19:46:42.329: E/AndroidRuntime(29792): at java.lang.reflect.Method.invoke(Method.java:511)
04-07 19:46:42.329: E/AndroidRuntime(29792): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
04-07 19:46:42.329: E/AndroidRuntime(29792): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
04-07 19:46:42.329: E/AndroidRuntime(29792): at dalvik.system.NativeStart.main(Native Method)
04-07 19:46:42.329: E/AndroidRuntime(29792): Caused by: java.lang.ClassCastException: com.example.friends_home.MainActivity@41799cc0
04-07 19:46:42.329: E/AndroidRuntime(29792): at com.example.friends_home.Primary.onAttach(Primary.java:30)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:787)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.app.BackStackRecord.run(BackStackRecord.java:635)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1399)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.app.Activity.performStart(Activity.java:5197)
04-07 19:46:42.329: E/AndroidRuntime(29792): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2094)
04-07 19:46:42.329: E/AndroidRuntime(29792): ... 11 moreRe: Вызов одного фрагмента из другого
не реализован у Activity интерфейс onSomeEventListener.
