Страница 1 из 1

Вызов одного фрагмента из другого

Добавлено: 01 апр 2015, 20:09
Zammm
Доброго времени суток!
Вернулся к проблеме, которую всё-таки необходимо решить - не могу организовать замещение одного фрагмента другим.
Суть задачи: Есть активити, которое по умолчанию загружает некий фрагмент, в котором, в свою очередь, имеются кнопки. Нажатие на любую из этих кнопок по умолчанию должно приводить к замещению существующего фрагмента в контейнере на другой.
Для решения данной задачи хочу реализовать достаточно простой метод - передать данные из фрагмента в активити с помощью onAttach и затем уже из активити с помощью findViewById (если это возможно) вызвать новый фрагмент. Подскажите пожалуйста, возможно ли вообще это и, в частности, выбранным мною способом? Если же да - то я совершенно не могу понять, какие же данные передавать в активити в данном случае и как вызывать, соответственно, по этим данным другой фрагмент.

Re: Вызов одного фрагмента из другого

Добавлено: 01 апр 2015, 22:41
lamberto
Похоже на ViewPager попробуй посмотреть урок 125!?

Re: Вызов одного фрагмента из другого

Добавлено: 02 апр 2015, 11:11
Mikhail_dev

Re: Вызов одного фрагмента из другого

Добавлено: 02 апр 2015, 15:31
Zammm
Именно этим уроком я руководствовался, пытаясь организовать данную операцию... Меня интересует лишь то, какие же данные из фрагмента в активити пересылать, чтобы активити уже заменила существующий фрагмент требуемым? Не хватает мне знаний на это пока...

Re: Вызов одного фрагмента из другого

Добавлено: 02 апр 2015, 15:52
Mikhail_dev
В уроке написано как из фрагмента вызвать метод активности, где вы вольны делать что угодно. В примере метод someEvent принимает от фрагмента какой-то текст. Поставьте туда не текст к примеру, а int, и передавайте тег фрагмента. Дальше в активности, в этом методе по полученному тегу уже создавайте необходимый фрагмент

Re: Вызов одного фрагмента из другого

Добавлено: 02 апр 2015, 20:43
Zammm
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: Вызов одного фрагмента из другого

Добавлено: 05 апр 2015, 22:44
Zammm
Ребят, совсем запутался... Помогите, пожалуйста, всё же решить эту проблемку...

Вот код во фрагменте, из которого вызываю другой фрагмент:

Код: Выделить всё

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);
	}
}
После попытки запустить выпадает ошибка... в строке 30 фрагмента, как я понимаю:

Код: Выделить всё

throw new ClassCastException(activity.toString());

Re: Вызов одного фрагмента из другого

Добавлено: 06 апр 2015, 07:32
Foenix
Тебе потому никто не отвечает, потому что все забодались уже! Лог выкладывать надо, экстрасенсов нету гадать.

Re: Вызов одного фрагмента из другого

Добавлено: 07 апр 2015, 19:54
Zammm

Код: Выделить всё

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 more

Re: Вызов одного фрагмента из другого

Добавлено: 08 апр 2015, 08:47
klblk
не реализован у Activity интерфейс onSomeEventListener.