Урок 110. Android 3. Fragments. DialogFragment - диалог

Обсуждение уроков
Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение neoksi » 09 апр 2013, 22:46

Olivka
Прошу прощения, записал как слышится произношение, моя ошибка =)

П.С. дневной марафон кодинга не прошел незаметно)

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

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение Foenix » 09 апр 2013, 22:55

ну теперь-то и я поняла.
Проверила один из диалогов - ниче вроде не слетает..
R.id.team

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

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

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение rezak90 » 09 апр 2013, 23:06

варианты:
1) самый лёгкий - запретить перерисовку на поворотах;
2) переопределить в активити onConfigurationChanged и при повороте всё время передавать интерфейс в фрагмент
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение neoksi » 09 апр 2013, 23:07

Нашел.

В общем CallBack нужно организовывать с использованием setTargetFragment() и getTargetFragment().

Пример кода раз: http://stackoverflow.com/questions/1156 ... ion-change
И два: http://stackoverflow.com/questions/1373 ... ogfragment

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение neoksi » 11 апр 2013, 13:02

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

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

public class FragmentDialogCalendarAct extends DialogFragment implements OnResultListener {
	
	private static final String KEY_SAVE_INSTANCE_DIALOG_CALENDAR_ACT_DATE_SELECT = "fragment:dialog_calendar_act:date_select";
	
	private Long DateSelectTS;
	private sUserAccount Account;
	
	public FragmentDialogCalendarAct(){
		// Пустой конструктор для пересоздания в случае поворота экрана.
		DateSelectTS=null;
	}

	public FragmentDialogCalendarAct(long _DateSelectTS){
		DateSelectTS = _DateSelectTS;
	}	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Account = sUserAccount.getInstance(getSupportActivity());
		if(savedInstanceState!=null && DateSelectTS==null){
			DateSelectTS=savedInstanceState.getLong(KEY_SAVE_INSTANCE_DIALOG_CALENDAR_ACT_DATE_SELECT, fDAT.getUTSThisDayLong());
		}
		if(DateSelectTS==null){
			DateSelectTS=fDAT.getUTSThisDayLong();
		}
	}
	
	@Override
	public void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		outState.putLong(KEY_SAVE_INSTANCE_DIALOG_CALENDAR_ACT_DATE_SELECT, DateSelectTS.longValue());
	}

	@Override
	public Dialog onCreateDialog(Bundle savedInstanceState) {			
		elCalendarViewer dlgCalendar = new elCalendarViewer(getSupportActivity(), DateSelectTS.longValue(), (int) Account.getUserFirstDayOfWeek(), this);
		return dlgCalendar.getDialog();
	}

	/**
	 * Реализация интерфейса elCalendarViewer.OnResultListener 
	 */
	@Override
	public void onChangeDate(long _ts, String _date) {
		if(OnChangeDateUTSListener.class.isInstance(getSupportActivity())){
			try{
				((OnChangeDateUTSListener) getSupportActivity()).onChangeDateUTS(_ts);
			}finally{
				// ничего не делаем
			}
		}				
	}	
	
	/**
	 * Интерфейс для обратного вызова.
	 */
	public interface OnChangeDateUTSListener {
		public void onChangeDateUTS(long _ts);
	}
	
		
}

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

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение rezak90 » 11 апр 2013, 21:11

наименование класса sUserAccount с маленькой буквы, переменной DateSelectTS с большой... с меня за такое пол з/п сдёрли бы.
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение neoksi » 11 апр 2013, 21:22

rezak90 писал(а):наименование класса sUserAccount с маленькой буквы, переменной DateSelectTS с большой... с меня за такое пол з/п сдёрли бы.
Знаю, по поводу класса, это маленькое введение для себя:
s (маленькая) - обозначает, что класс отвечает за работу с настройками или их хранит.
f (маленькая) - обозначает, что класс содержит в себе функции для разных преобразований данных или их получения в нужном виде.
А в переменной обычно ставлю вначале буковку m, тут просто про неё забыл, код трансформировался быстро и главное было найти оптимальный вариант работы.

П.С. Но вообще, когда программа пишется для себя, каждый сам выбирает удобное обозначение переменных и классов.

П.П.С. дело не в написании, а в документированности написанного.

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

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение rezak90 » 11 апр 2013, 21:55

На доже привыкать писать правильно, другим же будет приятно и наглядно. А вдруг завтра какой то Google захочет купить твой проект, покажешь код и будет стыдно.
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение neoksi » 11 апр 2013, 22:15

Мне не стыдно, мне главное чтоб было удобно.
Основная часть кода пишется правильно (как ты выражаешься), а допущения с названиями классов сделаны осознанно и специально.

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

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение rezak90 » 11 апр 2013, 22:18

ладно заканчиваю троллить, код не смотрел просто те две строчки кинулись в глаза.
R.id.team
Политика на форуме запрещена

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение igrok-vip » 06 май 2013, 22:18

DialogFragment работает только с API > 10? Можно ли как-то заставить его работать с API > 7?

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

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение rezak90 » 06 май 2013, 22:24

igrok-vip писал(а):DialogFragment работает только с API > 10? Можно ли как-то заставить его работать с API > 7?
Android Support Library
R.id.team
Политика на форуме запрещена

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение igrok-vip » 13 май 2013, 13:14

Опять нужна ваша помощь. Делаю всё по уроку. Но почему-то ошибка в вызове dlg1.show (The method show(FragmentManager, String) in the type DialogFragment is not applicable for the arguments (FragmentManager, String)), если использую Android Support Library. Как-то по другому нужно вызывать, если проект для android 2.1?

Вот код MainActivity
[syntax=java]package com.example.test11;

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.DialogFragment;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

DialogFragment dlg1;
Button btn1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dlg1 = new dialog1();
btn1 =(Button)findViewById(R.id.btnDlg1);
btn1.setOnClickListener(this);
}

@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;
}

public void onClick(View v) {
switch (v.getId()) {
case R.id.btnDlg1:
dlg1.show(getFragmentManager(), "dlg1");
break;
default:
break;
}

}
}[/syntax]

Вод диалога
[syntax=java]package com.example.test11;


import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

public class dialog1 extends DialogFragment implements OnClickListener {

final String LOG_TAG = "myLogs";

public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getDialog().setTitle("Title!");
View v = inflater.inflate(R.layout.dialog1, null);
v.findViewById(R.id.btnYes).setOnClickListener(this);
v.findViewById(R.id.btnNo).setOnClickListener(this);
v.findViewById(R.id.btnMaybe).setOnClickListener(this);
return v;
}

public void onClick(View v) {
Log.d(LOG_TAG, "Dialog 1: " + ((Button) v).getText());
dismiss();
}

public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
Log.d(LOG_TAG, "Dialog 1: onDismiss");
}

public void onCancel(DialogInterface dialog) {
super.onCancel(dialog);
Log.d(LOG_TAG, "Dialog 1: onCancel");
}
}[/syntax]

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение igrok-vip » 13 май 2013, 17:49

Убираю import android.support.v4.app.DialogFragment; ставлю import android.app.DialogFragment; - всё работает.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение damager82 » 14 май 2013, 14:07

igrok-vip писал(а): Убираю import android.support.v4.app.DialogFragment; ставлю import android.app.DialogFragment; - всё работает.
У вас смешались основные и support классы. Посмотрите Урок 114. Там есть пример как работать с фрагментами с использованием Support Library. Там другой наследуемый класс для Activity, другой класс FragmentManager, другой метод для получения FragmentManager.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение igrok-vip » 15 май 2013, 09:12

Ясно, спасибо

asolovey
Сообщения: 11
Зарегистрирован: 12 дек 2012, 00:58

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение asolovey » 31 май 2013, 00:05

Здравствуйте,
Такая задача. Есть ListView с картинкой и текстом. Нужно сделать так, чтобы при OnItemClick картинка открывалась поверх основного Активити. Я так подозреваю, что это нужно делать через DialogFragment, но не могу придумать, как передать в DialogFragment картинку.

Спасибо!

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

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение rezak90 » 31 май 2013, 00:33

asolovey писал(а):Здравствуйте,
Такая задача. Есть ListView с картинкой и текстом. Нужно сделать так, чтобы при OnItemClick картинка открывалась поверх основного Активити. Я так подозреваю, что это нужно делать через DialogFragment, но не могу придумать, как передать в DialogFragment картинку.

Спасибо!
передавать нужно путь к картинке, или же bitmap в bundle пихать, но лучше всё таки путь
R.id.team
Политика на форуме запрещена

asolovey
Сообщения: 11
Зарегистрирован: 12 дек 2012, 00:58

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение asolovey » 31 май 2013, 00:42

rezak90,
А Вы могли бы написать конкретнее, как это сделать(я новичок в Андроид). Вот сниппеты кода из DialogFragment и OnItemClick

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

public class ImageFragment extends DialogFragment {
	
	
	
	@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
		
		getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
		// Inflating layout for the dialog 
        View v = inflater.inflate(R.layout.single_image, null);
        ImageView fclogo = (ImageView) v.findViewById(R.id.singleimage);
 
        Bundle b = getArguments();
 
                
        return v;
    }

	
}

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

public void onItemClick(AdapterView<?> item, View v,
					int position, long id) {

				//Drawable d = getResources().getDrawable(position);

				
				 // Instantiating TimeDailogFragment, which is a  DialogFragment object 
					ImageFragment imFragment = new ImageFragment();
				  
				  // Creating a bundle object to store the position of the selected country 
				  Bundle b = new Bundle();
				 
				 // Storing the position in the bundle object
				 b.putInt("position", position);
				  
				  // Setting the bundle object as an argument to the DialogFragment object 
				 imFragment.setArguments(b);
				 
				 // Getting FragmentManager object 
				 FragmentManager fragmentManager = getFragmentManager();
				 
				  // Starting a FragmentTransaction 
				 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
				  
				 // Getting the previously created fragment object from the fragment manager 
				 ImageFragment imPrev = (ImageFragment)fragmentManager.findFragmentByTag("time_dialog");
				 
				 // If the previously created fragment object stillexists, then that has to be removed 
				 if(imPrev!=null)
				 fragmentTransaction.remove(imPrev);
				 
				  // Opening the fragment object
				 imFragment.show(fragmentTransaction, "time_dialog");
				 
			}

		};
Спасибо!

Грино
Сообщения: 12
Зарегистрирован: 30 май 2013, 12:27

Re: Урок 110. Android 3. Fragments. DialogFragment - диалог

Сообщение Грино » 31 май 2013, 06:14

Может и я когда-нибудь дочитаю до этого урока :geek:

Ответить