Урок 105. Android 3. Fragments. Динамическая работа

Обсуждение уроков
Александр Б
Сообщения: 18
Зарегистрирован: 30 авг 2012, 16:35

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Александр Б » 15 мар 2013, 20:22

Столкнулся с проблемой.
На одном layout`e у меня два фрагмента. Первый из них ListFragment (слева), Второй просто Fragment.
Мне нужно из второго заменить первый на обычный Fragment.

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

Orders_listview_frag orders_listview;
Orders_Win_frag orders_win_frag;
FragmentTransaction fTrans;
...
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
orders_win_frag = new Orders_Win_frag();
}
... 
fTrans = getFragmentManager().beginTransaction();
fTrans.replace(R.id.fragment1, orders_win_frag);
fTrans.commit();

Делаю все как в примере, но ничего не происходит... В чем может быть дело?

Snakebyte
Сообщения: 20
Зарегистрирован: 20 дек 2012, 08:18

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Snakebyte » 16 мар 2013, 19:02

new Orders_listview_frag() где?

Александр Б
Сообщения: 18
Зарегистрирован: 30 авг 2012, 16:35

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Александр Б » 16 мар 2013, 23:04

Snakebyte писал(а):new Orders_listview_frag() где?
проверил вместе с ним, эффект тот же. да я на самом деле уже раз двадцать проверял как угодно. и другие фрагменты пытался ставить и проект тестовый отдельно создавал, не помогает. может есть что то чего я не учитываю? или может нельзя заменить ListFragment просто так?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение rezak90 » 16 мар 2013, 23:56

в лейауте используйте FrameLayout а не Fragment и тогда всё получится =)
R.id.team
Политика на форуме запрещена

Александр Б
Сообщения: 18
Зарегистрирован: 30 авг 2012, 16:35

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Александр Б » 16 мар 2013, 23:57

rezak90 писал(а):в лейауте используйте FrameLayout а не Fragment и тогда всё получится =)
сейчас у меня так

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

            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >

                <LinearLayout
                    android:id="@+id/tab2"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" >

                    <fragment
                        android:id="@+id/fragment1"
                        android:name="com.example.taxi.moscow.project.MessagesListView_frag"
                        android:layout_width="316dp"
                        android:layout_height="match_parent"
                        android:layout_weight="0.00" />

                    <fragment
                        android:id="@+id/fragment2"
                        android:name="com.example.taxi.moscow.project.MessagesNew_frag"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent" />
                </LinearLayout>

я не очень понимаю где здесь именно я должен заменить Fragment на FrameLayout
только что попытался, в результате просто фрагмент не подгружается.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение rezak90 » 17 мар 2013, 00:11

в лейауте не обязательно указывать фрагмент, фреймлейаут является как контейнер, например:

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <FrameLayout
        android:id="@+id/masterFragment"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="0.6" />

    <FrameLayout
        android:id="@+id/detailFragment"
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1" />

</LinearLayout>
далее в коде:

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

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment fragment = new Fragment();
ft.replace(R.id.masterFragment, fragment);
то есть Вы можете любой фрагмент подсунуть, хоть лист фрагмент, так как он порожден от фрагмента
R.id.team
Политика на форуме запрещена

OldDriver
Сообщения: 2
Зарегистрирован: 17 сен 2013, 15:06

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение OldDriver » 27 сен 2013, 12:09

Добрый день. Столкнулся толи с багом, толи не понимаю что то.
Есть приложение с навигацией на фрагментах.(То что Eclipse делает при выборе Swipe навигации)
Во фрагменте вызываю startActivityForResult

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

@Override
    public boolean onOptionsItemSelected(MenuItem item) {	
        switch (item.getItemId()) {

        	case R.id.action_add_action:
        		Intent si = new Intent(getActivity(), NewActionActivity.class);
    			si.putExtra("requestCode", NewActionActivity.REQUEST_ADD_ACTION);
    			startActivityForResult(si, NewActionActivity.REQUEST_ADD_ACTION);
        		return true;
        			        	
	        default:
	            return super.onOptionsItemSelected(item);
        }
	}
Далее пытаюсь его поймать здесь же во фрагменте:

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

	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		Log.d(this.getClass().getName(),"Получено во fragment "+this.getId()+" requestCode="+requestCode+", resultCode="+resultCode);
		
	}
В Activiti где показываются фрагменты так же написал ловушку

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

@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		Log.d(this.getClass().getName(),"Получено во MainActiviti requestCode="+requestCode+", resultCode="+resultCode);
		
	}
В результате во фрагменте ловушка не срабатывает.(Нет в логе этой записи). Но срабатывает ловушка в Activity. Но в requestCode получаю полный мусор.
09-27 12:40:58.300: D/ru.mav.utils.mybudget.MainActivity(933): Получено во MainActiviti requestCode=65537, resultCode=-1
Вопрос? кто виноват и что сделать?

wHAzZzUp?!
Сообщения: 1
Зарегистрирован: 30 сен 2013, 07:42

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение wHAzZzUp?! » 30 сен 2013, 07:54

Добрый день. Подскажите пожалуйста: есть activity с кнопками. При нажатии на кнопку поверх накладывается фрагмент(не на всю activity). На фрагменте имеется кнопка, которая должна его закрывать, но когда вызываю getSupportFragmentManager().beginTransaction(); никаких данных туда не поступает и когда дело доходит до commit вылетает NullPointerExcaption... Как это исправить? Activity и Fragment находятся в разных классах.

hard
Сообщения: 44
Зарегистрирован: 13 сен 2013, 14:21

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение hard » 03 окт 2013, 12:10

тоже проблемма: getFragmentManager().findFragmentByTag и getFragmentManager().findFragmentById всегда ноль возвращают(

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

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.list);
		
		createFrGrid();
		setElementsInFrGrid();
	}

	public void createFrGrid() {
		Fragment fGrid = new FragmentGrid();
		FragmentTransaction ft = getFragmentManager().beginTransaction();
		ft.replace(R.id.content, fGrid, "fGrid");
		ft.commit();
	}

	public void setElementsInFrGrid() {
		FragmentGrid fGrid = (FragmentGrid) getFragmentManager().findFragmentByTag("fGrid");
		if(fGrid!=null){
			Toast.makeText(getApplicationContext(), "fff0", Toast.LENGTH_LONG).show();
		}
	}

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

public class FragmentGrid extends Fragment implements OnItemClickListener {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View v = inflater.inflate(R.layout.frag_grid,container, false);

		return v;
	}
В чем может быть причина?

разобрался

Noricon
Сообщения: 1
Зарегистрирован: 13 окт 2013, 14:08

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Noricon » 13 окт 2013, 14:29

Доброго дня. Уважаемые форумчане, подскажите. Нужно создать приложение которое имеет 3 вкладки. Вкладки реализованы в виде RadioGroup / RadioButton). Контейнеры табов - фрагменты. Для примера брал 105 урок.

MainActivity

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


import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RadioButton;


@SuppressLint("NewApi")
public class MainActivity extends FragmentActivity {
	
	Fragment1 frag1;
	Fragment2 frag2;
	Fragment3 frag3;
	OnClickListener radioListener;
	android.app.FragmentTransaction fTrans;
	  
	  @Override
	  public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.main);

	    frag1 = new Fragment1();
	    frag2 = new Fragment2();
	    frag3 = new Fragment3();
	    
	    RadioButton  rb01 = (RadioButton)findViewById(R.id.rb01);
	    rb01.setOnClickListener(radioListener);

	    RadioButton rb02 = (RadioButton)findViewById(R.id.rb02);
	    rb02.setOnClickListener(radioListener);

	    RadioButton rb03 = (RadioButton)findViewById(R.id.rb03);
	    rb03.setOnClickListener(radioListener);


	  radioListener = new OnClickListener() {
			@Override
			public void onClick(View v) {
			    boolean checked = ((RadioButton) v).isChecked();
			    
				RadioButton rb = (RadioButton)v;
				switch (rb.getId()) {
				case R.id.rb01:
					 if (checked){
						 	FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
			            	transaction.replace(R.id.fragment1, new Fragment1(), Fragment1.class.getClass().getName());        
			            	transaction.addToBackStack(null);
			            	transaction.commit();
							 }
				    break;
				case R.id.rb02:
					 if (checked){
						 	FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
			            	transaction.replace(R.id.fragment1, new Fragment2(), Fragment2.class.getClass().getName());        
			            	transaction.addToBackStack(null);
			            	transaction.commit();
							 }
				    break;
				case R.id.rb03:
					 if (checked){
						 	FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
			            	transaction.replace(R.id.fragment1, new Fragment3(), Fragment3.class.getClass().getName());        
			            	transaction.addToBackStack(null);
			            	transaction.commit();
							 }
				    break;
				default:
					break;
				}
			}
		};
	}
}
Layout Main

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/text01"
            android:layout_width="fill_parent"
            android:layout_height="20dp"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:text="1_Frag" />

        <TextView
            android:id="@+id/text02"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:text="2_Frag" />

        <TextView
            android:id="@+id/text03"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:text="3_Frag" />

        <TextView
            android:id="@+id/text04"
            android:layout_width="fill_parent"
            android:layout_height="20dp"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:text="4_Frag" />

        <TextView
            android:id="@+id/text05"
            android:layout_width="fill_parent"
            android:layout_height="20dp"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:text="5_Frag" />
    </LinearLayout>

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <RadioButton
            android:id="@+id/rb01"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="24dp"
            android:layout_weight="1"
            android:checked="true" />

        <RadioButton
            android:id="@+id/rb02"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="24dp"
            android:layout_weight="1" />

        <RadioButton
            android:id="@+id/rb03"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="24dp"
            android:layout_weight="1" />

        <RadioButton
            android:id="@+id/rb04"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="24dp"
            android:layout_weight="1" />

        <RadioButton
            android:id="@+id/rb05"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="24dp"
            android:layout_weight="1" />
    </RadioGroup>

 <FrameLayout
 android:id="@+id/fragment1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_weight="1">
</FrameLayout>

</LinearLayout>

Идея в том, что бы по нажатию на radiobtn открывался нужный фрагмент. Ошибки нет никакой фрагменты просто не отображаются. Буду благодарен помощи.

OldDriver
Сообщения: 2
Зарегистрирован: 17 сен 2013, 15:06

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение OldDriver » 30 окт 2013, 20:32

OldDriver писал(а):Добрый день. Столкнулся толи с багом, толи не понимаю что то.
Есть приложение с навигацией на фрагментах.(То что Eclipse делает при выборе Swipe навигации)
Во фрагменте вызываю startActivityForResult

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

@Override
    public boolean onOptionsItemSelected(MenuItem item) {	
        switch (item.getItemId()) {

        	case R.id.action_add_action:
        		Intent si = new Intent(getActivity(), NewActionActivity.class);
    			si.putExtra("requestCode", NewActionActivity.REQUEST_ADD_ACTION);
    			startActivityForResult(si, NewActionActivity.REQUEST_ADD_ACTION);
        		return true;
        			        	
	        default:
	            return super.onOptionsItemSelected(item);
        }
	}
Далее пытаюсь его поймать здесь же во фрагменте:

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

	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		Log.d(this.getClass().getName(),"Получено во fragment "+this.getId()+" requestCode="+requestCode+", resultCode="+resultCode);
		
	}
В Activiti где показываются фрагменты так же написал ловушку

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

@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		Log.d(this.getClass().getName(),"Получено во MainActiviti requestCode="+requestCode+", resultCode="+resultCode);
		
	}
В результате во фрагменте ловушка не срабатывает.(Нет в логе этой записи). Но срабатывает ловушка в Activity. Но в requestCode получаю полный мусор.
09-27 12:40:58.300: D/ru.mav.utils.mybudget.MainActivity(933): Получено во MainActiviti requestCode=65537, resultCode=-1
Вопрос? кто виноват и что сделать?
Ответ найден:
Нужно в активити вернуть родителю:

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

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
}
И все стало правильно возвращаться.

SevenXP
Сообщения: 113
Зарегистрирован: 21 июл 2013, 18:20

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение SevenXP » 26 мар 2014, 18:06

Со старого проекта взял 2 анимации, они там работают но в новом проекте не работают:
В старом проекте использовал getSupportFragmentManager....
В новом getFragmentManager...

Это единственное различие.
Пока работает анимация только такая:
fragmentTransaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
Если android.R.animator заменить на android.R.anim ошибка та же, что и при использовании собственной анимации.
Файлы с анимацией находятся в drawable ( пробовал и в папка: anim, animator)

Но в новом проекте падает ошибка:
03-26 17:47:53.323: E/AndroidRuntime(3182): FATAL EXCEPTION: main
03-26 17:47:53.323: E/AndroidRuntime(3182): Process: com.vironit.damedia.jtinews, PID: 3182
03-26 17:47:53.323: E/AndroidRuntime(3182): java.lang.RuntimeException: Unknown animator name: alpha
03-26 17:47:53.323: E/AndroidRuntime(3182): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:129)
03-26 17:47:53.323: E/AndroidRuntime(3182): at android.animation.AnimatorInflater.createAnimatorFromXml(AnimatorInflater.java:93)
03-26 17:47:53.323: E/AndroidRuntime(3182): at android.animation.AnimatorInflater.loadAnimator(AnimatorInflater.java:72)
В чем проблема? и как создать анимацию, что бы она проигрывалась.

torgash
Сообщения: 2
Зарегистрирован: 28 янв 2014, 13:23

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение torgash » 24 июл 2014, 20:38

В чем проблема? и как создать анимацию, что бы она проигрывалась.
Проблемы нет. Как и анимации alpha в Android 2.x. Альфу ввели только в Android 3 (API 11)
Просто не используйте alpha анимацию, и всё. Или не поддерживайте 2.x (API 10 и ниже) вообще.

Аватара пользователя
mdzht
Сообщения: 124
Зарегистрирован: 11 ноя 2013, 11:33
Откуда: fock it
Контактная информация:

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение mdzht » 09 сен 2014, 09:17

лав лав лав лав, ла-лав-лав лав лав http://developer.android.com/training/b ... nt-ui.html
«Life is too short to spend rewriting code»

finberg
Сообщения: 51
Зарегистрирован: 11 мар 2013, 14:20

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение finberg » 19 сен 2014, 09:04

Друзья, доброе утро, есть небольшой вопрос.
Есть Activity хост с ViewPager, в нем крутятся фрагменты, данные для наполнения фрагментов берутся и БД.
Есть необходимость изменять иинформаци, отображаемую в фрагментах и сохранять в БД. Создал кнопку в ActionBar, создал фрагмент с EditText, куда передаются данные для редактирования, но не могу понять, куда мне лучше подцепить этот фрагмент для редактирования, к какому контейнеру? Создать новую Activity хост для него и вывести в неё? По пойму не самый оптимальный вариант. Есть ли возможность подвесить её к уже существующей Activity которая с ViewPager, например создать в ней ещё один контейнер или как-то подвесить к самому ViewPager?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Mikhail_dev » 19 сен 2014, 09:30

Activity хост
что это?
Есть необходимость изменять иинформаци, отображаемую в фрагментах и сохранять в БД.
1. Фрагменты общаются с Activity, в которой находятся через слушатель, а активность уже сохраняет результаты.
2. Фрагменты сами сохраняют результаты.
Есть ли возможность подвесить её к уже существующей Activity которая с ViewPager
Что значит "подвесить"?

narwork
Сообщения: 1
Зарегистрирован: 16 ноя 2014, 22:50

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение narwork » 16 ноя 2014, 23:11

Здравствуйте, хотел спросить как программно добавлять view-элемент на фрагмент так, чтобы при удалении и затем обратной загрузки фрагмента добавленный view-элемент не исчез. (Фрагмент в приложении создается один раз в начале, потом вызывается уже созданный, я не создаю каждый раз новый)
Такой код в описании фрагмент:

CheckBox chbDelete = (CheckBox)new CheckBox(getActivity());
llBox.addView(chbDelete); //llbox - linear layout во фрагменте

senkoevg
Сообщения: 2
Зарегистрирован: 21 ноя 2014, 07:07

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение senkoevg » 21 ноя 2014, 07:28

Всем привет, помогите пожалуйста найти ошибку. В активити при нажатии на кнопку один фрагмент должен заменяться на другой, но при нажатии на кнопку прога вылетает с ошибкой. Логи указывают на ошибку в onClick при выполнении команды commit().

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

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class MainActivity extends //ActionBarActivity 
									FragmentActivity {

	FragmentTransaction fTrans;
	TCFragment tc_frag;
	TICFragment tic_frag;
	Button BtnToTC;
	Button BtnToTIC;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		BtnToTC = (Button) findViewById(R.id.button_to_tc);
		BtnToTIC = (Button) findViewById(R.id.button_to_tic);
		tc_frag = new TCFragment();
		tic_frag = new TICFragment();
		fTrans = getSupportFragmentManager().beginTransaction();
		if (savedInstanceState == null) {
			fTrans.add(R.id.container, tc_frag).commit();
			BtnToTC.setEnabled(false);
			BtnToTIC.setEnabled(true);
		}
	}

	@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.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button_to_tc:
			fTrans.replace(R.id.container, tc_frag);
			BtnToTC.setEnabled(false);
			BtnToTIC.setEnabled(true);
			break;
		case R.id.button_to_tic:
			fTrans.replace(R.id.container, tic_frag);
			BtnToTC.setEnabled(true);
			BtnToTIC.setEnabled(false);
			fTrans.addToBackStack(null);
			break;
		}
		fTrans.commit();
	}

	/**
	 * A placeholder fragment containing a simple view.
	 */
	public static class TCFragment extends Fragment {

		public TCFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.frag_timer_calc,
					container, false);
			return rootView;
		}
	}

	public static class TICFragment extends Fragment {

		public TICFragment() {
		}

		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container,
				Bundle savedInstanceState) {
			View rootView = inflater.inflate(R.layout.frag_time_interval_calc,
					container, false);
			return rootView;
		}
	}
}
Логи ошибок:

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

11-21 04:14:19.373: E/AndroidRuntime(332): FATAL EXCEPTION: main
11-21 04:14:19.373: E/AndroidRuntime(332): java.lang.IllegalStateException: Could not execute method of the activity
11-21 04:14:19.373: E/AndroidRuntime(332): 	at android.view.View$1.onClick(View.java:2144)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at android.view.View.performClick(View.java:2485)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at android.view.View$PerformClick.run(View.java:9080)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at android.os.Handler.handleCallback(Handler.java:587)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at android.os.Handler.dispatchMessage(Handler.java:92)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at android.os.Looper.loop(Looper.java:123)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at java.lang.reflect.Method.invokeNative(Native Method)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at java.lang.reflect.Method.invoke(Method.java:507)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at dalvik.system.NativeStart.main(Native Method)
11-21 04:14:19.373: E/AndroidRuntime(332): Caused by: java.lang.reflect.InvocationTargetException
11-21 04:14:19.373: E/AndroidRuntime(332): 	at java.lang.reflect.Method.invokeNative(Native Method)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at java.lang.reflect.Method.invoke(Method.java:507)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at android.view.View$1.onClick(View.java:2139)
11-21 04:14:19.373: E/AndroidRuntime(332): 	... 11 more
11-21 04:14:19.373: E/AndroidRuntime(332): Caused by: java.lang.IllegalStateException: commit already called
11-21 04:14:19.373: E/AndroidRuntime(332): 	at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:623)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:615)
11-21 04:14:19.373: E/AndroidRuntime(332): 	at ru.senkoevg.timercalculator.MainActivity.onClick(MainActivity.java:72)
11-21 04:14:19.373: E/AndroidRuntime(332): 	... 14 more

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Mikhail_dev » 21 ноя 2014, 10:04

Вы уже выполнили транзакцию и закрыли её коммитом (fTrans.add(R.id.container, tc_frag).commit();), поэтому и ругается что вы еще раз пытаетесь сделать коммит в onClick.
P.S. не пишите так транзакции, не делайте их глобальными. Пишите прямо в методе весь код, связанный с транзакцией, не размазывайте её на весь класс.

senkoevg
Сообщения: 2
Зарегистрирован: 21 ноя 2014, 07:07

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение senkoevg » 27 ноя 2014, 07:44

Всем привет, еще раз обращаюсь за помощью. Та же программа - при нажатии на кнопку в активити происходит замена одного фрагмента на другой. После смены ориентации экрана мне надо программно определить какой из двух фрагментов отображается (или оба), но ни один из методов не работает (всегда false): fragment.isAdded(), fragment.isVisible(), fragment.isResumed(), fragment.isInLayout(). Помогите плиз найти ошибку.

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

package ru.senkoevg.timercalculator;

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends // ActionBarActivity
		FragmentActivity {

	final String LOG_TAG = "myLogs";

	private FragmentTransaction fTrans;
	private Fragment tc_frag;
	private Fragment tic_frag;
	Button BtnToTC;
	Button BtnToTIC;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		tc_frag = new TCFragment();
		tic_frag = new TICFragment();
		BtnToTC = (Button) findViewById(R.id.button_to_tc);
		BtnToTIC = (Button) findViewById(R.id.button_to_tic);
		boolean ScrnConfLL = ((getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) && isLarge());

		if (savedInstanceState == null) {
			fTrans = getSupportFragmentManager().beginTransaction();
			fTrans.add(R.id.container, tc_frag);
			if (ScrnConfLL == true) { //если landscape & large
				fTrans.add(R.id.containerRight, tic_frag);
			} else {	
				BtnToTC.setVisibility(View.GONE);
				BtnToTIC.setVisibility(View.VISIBLE);
			}
			fTrans.commit();
		} else {
			if (ScrnConfLL & (tic_frag.isAdded() == false)) { //если (landscape & large) & tic_frag еще не добавлен
				Log.d(LOG_TAG, "add tic_frag");
				fTrans = getSupportFragmentManager().beginTransaction();
				fTrans.add(R.id.containerRight, tic_frag).commit();
			}
			if (ScrnConfLL == false) {
				Log.d(LOG_TAG, "landscape & large == false");
				if (tic_frag.isVisible()){ //Почему-то не работает
					Log.d(LOG_TAG, "tic_frag isVisible");
					BtnToTIC.setVisibility(View.GONE);
				}
				if (tc_frag.isVisible()){ //Почему-то не работает
					Log.d(LOG_TAG, "tc_frag isVisible");
					BtnToTC.setVisibility(View.GONE);
				}
				// далее экспериментирую:
				if (tc_frag.isAdded() | tic_frag.isAdded()) {
					Log.d(LOG_TAG, "fragment added");
				}
				if (tc_frag.isVisible() | tic_frag.isVisible()) {
					Log.d(LOG_TAG, "fragment is Visible");
				}
				if (tc_frag.isResumed() | tic_frag.isResumed()) {
					Log.d(LOG_TAG, "fragment is Resumed");
				}
				if (tc_frag.isInLayout() | tic_frag.isInLayout()) {
					Log.d(LOG_TAG, "fragment is In Layout");
				}
			}
		}
	}

	public void onClick(View v) {
		fTrans = getSupportFragmentManager().beginTransaction();
		switch (v.getId()) {
		case R.id.button_to_tc:
			fTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
			fTrans.replace(R.id.container, tc_frag);
			BtnToTC.setVisibility(View.GONE);
			BtnToTIC.setVisibility(View.VISIBLE);
			break;
		case R.id.button_to_tic:
			fTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
			fTrans.replace(R.id.container, tic_frag);
			BtnToTC.setVisibility(View.VISIBLE);
			BtnToTIC.setVisibility(View.GONE);
			break;
		}
		fTrans.commit();
	}

	boolean isLarge() {
		return (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
	}
}
Строка №50 в лог выводится, а дальше ни один if не срабатывает и в логах тишина.

Ответить