fragment -ы

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

fragment -ы

Сообщение Rustam » 27 июн 2014, 22:44

Копал, копал не нашел ответа
есть MainActivity
в нем FrameLayout, который наполняется фрагментами

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

//переключение tab-ов-обработка
        Tab_view.setOnTabChangedListener(new OnTabChangeListener() {
			
			@Override
			public void onTabChanged(String tabId) {
				// TODO Auto-generated method stub	
				work_space=getFragmentManager().beginTransaction();
				if (tabId=="tab1") {//главный экран
					common_screen=new common_frag();
					work_space.replace(com.example.acorz.R.id.work_space,common_screen);
				
				}
				if (tabId=="tab2") {//экран настроек
					change_screen=new change_frag();
					work_space.replace(com.example.acorz.R.id.work_space,change_screen);
				
				}
				if (tabId=="tab3") {//экран результата
					result_screen=new result_frag();
					work_space.replace(com.example.acorz.R.id.work_space,result_screen);
				
				}
				//work_space.addToBackStack(null);
				work_space.commit();// Обновление рабочего поля
			}
		});


Собственно один класс из фрагментов

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

package com.example.acorz;

import android.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.WorkSource;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class common_frag extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
		      Bundle savedInstanceState) {
		    return inflater.inflate(com.example.acorz.R.layout.common, container, false	);
		    
	}
	
	public void about_btn_clk(View v){
		
		AlertDialog.Builder builder=new AlertDialog.Builder(getActivity().getApplicationContext());
		
		builder.setTitle("ERROR")
		.setCancelable(false)
		.setMessage("ERROR :")
		.setPositiveButton("OK", 
				new DialogInterface.OnClickListener() {
					
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						dialog.cancel();
						//work=true;
					}
				});
		AlertDialog alert=builder.create();
		alert.show(); 
		
	}

}

при работе приложения при нажатии на кнопку приложение вылетает
ошибка как я понял выдается изза того что я не верно передаю Context в Builder
как правильно делать так и не понял
Последний раз редактировалось Rustam 28 июн 2014, 09:20, всего редактировалось 1 раз.

Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Re: fragment -ы

Сообщение Rustam » 27 июн 2014, 23:13

решил вопрос вот так
переписав метод OnCreate в фрагменте

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

public class common_frag extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
		      Bundle savedInstanceState) {
			//создание view
			View v=inflater.inflate(com.example.acorz.R.layout.common, container, false);
			//получение кнопки "О программе"
			Button about_btn=(Button)v.findViewById(com.example.acorz.R.id.about_btn);
			//обработчик нажатия на кнопку "О программе"
			about_btn.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					AlertDialog.Builder builder=new AlertDialog.Builder(v.getContext());
					//AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
					builder.setTitle("О программе")
					.setCancelable(false)
					.setMessage("Первый тест, дальше больше :)")
					.setPositiveButton("OK", 
							new DialogInterface.OnClickListener() {
								
								@Override
								public void onClick(DialogInterface dialog, int which) {
									// TODO Auto-generated method stub
									dialog.cancel();
									//work=true;
								}
							});
					AlertDialog alert=builder.create();
					alert.show(); 
				}
			});
		
				
		    return v;
		    
	};


Но вот все равно вопрос как правильно общаться между классами MainActivity и классами фрагментами
Последний раз редактировалось Rustam 28 июн 2014, 09:22, всего редактировалось 1 раз.

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

Re: fragment -ы

Сообщение Mikhail_dev » 28 июн 2014, 00:15

Пожалуйста, уберите код в теги. Ну сложно читать, честно.

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

Re: fragment -ы

Сообщение Mikhail_dev » 28 июн 2014, 13:10

при работе приложения при нажатии на кнопку приложение вылетает
ошибка как я понял выдается изза того что я не верно передаю Context в Builder
как правильно делать так и не понял
Надо не думать, надо смотреть и понимать что за ошибка. Вам обязателен к просмотру данный вебинар, который научит находить ошибки
viewtopic.php?f=60&t=3198
Ошибка тут из-за незнания Вами Java, ибо
tabId=="tab1"
так строки никто не сравнивает. В итоге вы просто на выходе из условия получите common_screen как нулевой объект.
Классы обычно называют с большой буквы. common_frag - это плохой стиль и сразу бросается в глаза.

Изучайте Java, без неё нет смысла учить Android. Ну и почитайте мою вторую заметку в моей подписи, сверху.

Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Re: fragment -ы

Сообщение Rustam » 29 июн 2014, 21:02

сравнение tabId=="tab1" работает безотказно, переключение tab-ов работает

Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Re: fragment -ы

Сообщение Rustam » 29 июн 2014, 21:25

Возник другой вопрос:
как организовать доступ к элементам fragment-ов
есть фрагмент на котором расположен GridView
по нажатию кнопки я достаю этот фрагмент и помещаю в менеджер фрагментов

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

        work_space=getFragmentManager().beginTransaction();
		sale_screen=new sale_frag();
		work_space.replace(com.example.acorz.R.id.work_space,sale_screen);
		work_space.commit();
		Tab_view.setCurrentTab(3);
как получить доступ к заполнению GridView
такой вот способ никак не выдает ссылку, всегда null

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

Fragment frag=getFragmentManager().findFragmentById(R.id.work_space);
        sale_grid=(GridView)frag.getView().findViewById(R.id.sale_grid_View);
и вообще везде указывается по-разному возможность доступа к элементам фрагментов
каким образом делать этот доступ? много инфы перелапатил

есть вариант доступа к GridView в самом в фрагменте в методе OnCreate - там все работает, но там возникает другой вопрос
пропадает возможность доступа к ресурсам приложения, в частности, к папке Drawable.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: fragment -ы

Сообщение Foenix » 29 июн 2014, 22:38

Rustam писал(а):сравнение tabId=="tab1" работает безотказно, переключение tab-ов работает
ого! :mrgreen:
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

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

Re: fragment -ы

Сообщение Mikhail_dev » 30 июн 2014, 08:56

сравнение tabId=="tab1" работает безотказно, переключение tab-ов работает
Ясно. Дальше даже не читал. Подучите Java - приходите.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: fragment -ы

Сообщение KamiSempai » 30 июн 2014, 12:30

Mikhail_dev писал(а):
сравнение tabId=="tab1" работает безотказно, переключение tab-ов работает
Ясно. Дальше даже не читал. Подучите Java - приходите.
Foenix писал(а):
Rustam писал(а):сравнение tabId=="tab1" работает безотказно, переключение tab-ов работает
ого! :mrgreen:
Скорее всего в tabId находится интернированная строка, так что tabId=="tab1" действительно должен работать. Вопрос только в том, понимает ли это Rustam.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Rustam
Сообщения: 40
Зарегистрирован: 13 апр 2014, 11:38

Re: fragment -ы

Сообщение Rustam » 04 июл 2014, 21:11

Пример переключение TAB-ов
взят отсюда
http://startandroid.ru/ru/uroki/vse-uro ... ladki.html

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

package ru.startandroid.develop.p0781tabcontentfactory;

import android.app.TabActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TabHost;
import android.widget.TextView;

public class MainActivity extends TabActivity {
 
  final String TABS_TAG_1 = "Tag 1";
  final String TABS_TAG_2 = "Tag 2";
 
 
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        TabHost tabHost = getTabHost();
       
        TabHost.TabSpec tabSpec;
       
        tabSpec = tabHost.newTabSpec(TABS_TAG_1);
        tabSpec.setContent(TabFactory);
        tabSpec.setIndicator("Вкладка 1");
        tabHost.addTab(tabSpec);
       
        tabSpec = tabHost.newTabSpec(TABS_TAG_2);
        tabSpec.setContent(TabFactory);
        tabSpec.setIndicator("Вкладка 2");
        tabHost.addTab(tabSpec);
       
    }
   
    TabHost.TabContentFactory TabFactory = new TabHost.TabContentFactory() {
   
    @Override
    public View createTabContent(String tag) {
      if (tag == TABS_TAG_1) {
        return getLayoutInflater().inflate(R.layout.tab, null);
      } else if (tag == TABS_TAG_2) {
        TextView tv = new TextView(MainActivity.this);
        tv.setText("Это создано вручную");
        return tv;
      }
      return null;
    }
  };
}
и не надо тут говорить, что tag == TABS_TAG_1 не работает, здесь все работает, если своим ответом ставите цель только указать на то, что Новичок что-то не знает - Ваше право, только смысл писать ответ не на поставленный вопрос?? :|

Вопрос был в другом: как правильно передавать данные между фрагментами, но в итоге я его решил иначе, без создание фрагментов(активностей)
так что тему можно закрывать :mrgreen:

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: fragment -ы

Сообщение altwin » 04 июл 2014, 21:26

Rustam писал(а):Пример переключение TAB-ов
взят отсюда
http://startandroid.ru/ru/uroki/vse-uro ... ladki.html

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

package ru.startandroid.develop.p0781tabcontentfactory;

import android.app.TabActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TabHost;
import android.widget.TextView;

public class MainActivity extends TabActivity {
 
  final String TABS_TAG_1 = "Tag 1";
  final String TABS_TAG_2 = "Tag 2";
 
 
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        TabHost tabHost = getTabHost();
       
        TabHost.TabSpec tabSpec;
       
        tabSpec = tabHost.newTabSpec(TABS_TAG_1);
        tabSpec.setContent(TabFactory);
        tabSpec.setIndicator("Вкладка 1");
        tabHost.addTab(tabSpec);
       
        tabSpec = tabHost.newTabSpec(TABS_TAG_2);
        tabSpec.setContent(TabFactory);
        tabSpec.setIndicator("Вкладка 2");
        tabHost.addTab(tabSpec);
       
    }
   
    TabHost.TabContentFactory TabFactory = new TabHost.TabContentFactory() {
   
    @Override
    public View createTabContent(String tag) {
      if (tag == TABS_TAG_1) {
        return getLayoutInflater().inflate(R.layout.tab, null);
      } else if (tag == TABS_TAG_2) {
        TextView tv = new TextView(MainActivity.this);
        tv.setText("Это создано вручную");
        return tv;
      }
      return null;
    }
  };
}
и не надо тут говорить, что tag == TABS_TAG_1 не работает, здесь все работает, если своим ответом ставите цель только указать на то, что Новичок что-то не знает - Ваше право, только смысл писать ответ не на поставленный вопрос?? :|

Вопрос был в другом: как правильно передавать данные между фрагментами, но в итоге я его решил иначе, без создание фрагментов(активностей)
так что тему можно закрывать :mrgreen:
This class was deprecated in API level 13.
Вы учитесь делать не правильно?
Но вот все равно вопрос как правильно общаться между классами MainActivity и классами фрагментами
работа с фрагментами 104 - 111 уроки включительно.
Изображение

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

Re: fragment -ы

Сообщение Mikhail_dev » 05 июл 2014, 13:42

Вы учитесь делать не правильно?
А как ты думаешь, если человек объекты сравнивает через == ?

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: fragment -ы

Сообщение altwin » 05 июл 2014, 13:57

Mikhail_dev писал(а):
Вы учитесь делать не правильно?
А как ты думаешь, если человек объекты сравнивает через == ?
Почитал тему.. тут и думать не нужно... ведь в ответ прозвучало только - оно же работает... и я вообще другое спрашивал, а вот то, что получение похожего результата и работает разные вещи, мало кому интересно :) Автору бы профессию сменить с таким подходом срочно...
Изображение

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

Re: fragment -ы

Сообщение finberg » 06 июл 2014, 14:06

Mikhail_dev писал(а):
Вы учитесь делать не правильно?
А как ты думаешь, если человек объекты сравнивает через == ?
Строковые константы, впринципе, можно сравнивать через ==. Так написано в книге Хорстмана.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: fragment -ы

Сообщение altwin » 06 июл 2014, 15:03

finberg писал(а):
Mikhail_dev писал(а):
Вы учитесь делать не правильно?
А как ты думаешь, если человек объекты сравнивает через == ?
Строковые константы, впринципе, можно сравнивать через ==. Так написано в книге Хорстмана.
просто слов нет... ну и какое нафик отношение это имеет к сравнению объектов? Хотя да можно пойти путем переопределения метода toString для сравниваемых классов и задать одинаковое значение, вот только вы хоть понимаете какая это чушь?
Изображение

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: fragment -ы

Сообщение KamiSempai » 07 июл 2014, 10:51

altwin писал(а):
finberg писал(а):...
Строковые константы, впринципе, можно сравнивать через ==. Так написано в книге Хорстмана.
просто слов нет... ну и какое нафик отношение это имеет к сравнению объектов? Хотя да можно пойти путем переопределения метода toString для сравниваемых классов и задать одинаковое значение, вот только вы хоть понимаете какая это чушь?
Это имеет прямое отношение к объектам, так как сравниваются ссылки на них. Строковые константы в этом плане не отличаются от остальных. Так что, если в переменной хранятся только ссылки на константы, можно использовать сравнение "==". Если же строка не является ссылкой на константу, то ее достаточно интернировать. Все константы интернируются автоматически.
[syntax=java]String s1 = "qwert";
String s2 = "qwert";

StringBuilder builder = new StringBuilder("qwe");
builder.append("rt");

s1 == s2 // Истина
s1 == builder.toString() // Ложь
s1 == builder.toString().intern() // Истина[/syntax]
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: fragment -ы

Сообщение Mikhail_dev » 07 июл 2014, 13:32

finberg писал(а):
Mikhail_dev писал(а):
Вы учитесь делать не правильно?
А как ты думаешь, если человек объекты сравнивает через == ?
Строковые константы, впринципе, можно сравнивать через ==. Так написано в книге Хорстмана.
Враньё. Я читал Хорстмана, оба тома. Таким образом сравнивать нельзя строки.

Viewer
Сообщения: 180
Зарегистрирован: 30 апр 2014, 11:42

Re: fragment -ы

Сообщение Viewer » 07 июл 2014, 14:08



Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: fragment -ы

Сообщение KamiSempai » 07 июл 2014, 15:02

Mikhail_dev писал(а):И где там intern???
[syntax=java] final String TABS_TAG_1 = "Tag 1";
final String TABS_TAG_2 = "Tag 2"; [/syntax]
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить