Страницы

Поиск по вопросам

Показаны сообщения с ярлыком dialogfragment. Показать все сообщения
Показаны сообщения с ярлыком dialogfragment. Показать все сообщения

четверг, 9 апреля 2020 г.

Android/Java. Как отобразить активити в форме Диалога?

#android #android_fragment #activity #style #dialogfragment

                    
Необходимо отобразить активити в форме Диалога.. чтобы задний фон расплывчат был..
А у самой активити должны быть скругленные углы. 

Вот как на рисунке:



Как это делается? Что и В каких методах или файлах прописывать?
    


Ответы

Ответ 1



В манифесте пропиши у активити: Или просто сделай прозрачный фон, а на самой активити рисуй что хочешь. Для этого в манифесте пропиши:

Ответ 2



Создай layout для диалог-фрагмента. public class AddList extends DialogFragment implements Далее тебе нужно будет создать такой класс: public class extends DialogFragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { AlertDialog.Builder adb = new AlertDialog.Builder(getActivity()); rootView = inflater.inflate(R.layout., container); adb.setView(rootView); return rootView; } } И внутри прописать всё, что нужно. А внутри нужного активити прописать: dialog = new (); dialog.show(getSupportFragmentManager(), "");

пятница, 13 марта 2020 г.

Android: правильное использование фрагментов и Navigation Drawer

#android #android_fragment #dialogfragment #android_navigation_drawer


Я использую в приложении шаблон Navigation Drawer Activity и у меня возникли несколько
вопросов по поводу правильного использования его и фрагментов в целом.


Т.к. все страницы (назову фрагменты, открываемые из бокового меню так) приложения
- фрагменты в одной активити, то я лишаюсь возможности использовать Intent для переключения
активиностей?
Как реализовать открытие фрагмента (какой-то страницы) по какому-то действию из другого
фрагмента? Сделать интерфейс, напримерIFragmentAction, со всеми событиями, которые
могут послать фрагменты, реализовать его у активити и вызывать эти методы из фрагментов?
А в них уже делать транзакции? Это правильно?
Аналогично, если нужно по действию во фрагменте показать фрагмент, не явлюящийся
"страницей" - надо делать аналогично, через активити? Или можно сделать транзакцию
прямо из фрагмента (в настоящий момент сделал так, но кажется это немного неправильно)
Если нужен режим для планшета, где некоторые фрагменты не открываются поверх старых,
а расположены рядом - надо создать новый layouyt еще одну активити, реализующую интерфейс,
но с другим поведением? Или это не самый правильный подход?
Как правильно вернуть результат из DialogFragment? Я реализовывал интерфейс у фрагмента,
который вызывал этот диалог, через который диалог устанавливал нужные значения. Кажется,
не лучший подход.
Столкнулся с такой проблемой: 
Если после нескольких смен фрагментов пользователь переходит через боковое меню на
другую страницу - он видит несколько наложившихся активностей. Если просто сделать
белый фон - задняя активность все равно останется кликабельной. 


Как правильно сделать переходы между активностями, чтобы не возникало таких проблем
и чтобы это было правильно?
    


Ответы

Ответ 1



Отвечу на всю историю примерным кодом. Пусть Ваш NavigationDrawer содержит кастомный адаптер для списка. При нажатии в списке на элемент вы к примеру получите йд нужного фрагмента, пусть это будет int, Но лучше строка. Получаем TAG Фрагмента. private String getTagById(int tagId) { String tag = null; if (Frag1.TAG_ID == tagId) { tag = Frag1.TAG; } else if (Frag2.TAG_ID == tagId) { tag = Frag2.TAG; } return tag; } Дальше в роль вступает участок кода для работы с фрагментами. В нем мы узнаем совпадает ли активный фрагмент с выбранным, если не совпадает мы сделаем detach активного, проверим открывали ли ранее выбранный и выполним replace или attach private void showFragment(String tag) { String oldTag = mSelectedTag; mSelectedTag = tag; final FragmentManager fm = getSupportFragmentManager(); final FragmentTransaction ft = fm.beginTransaction(); final Fragment oldFragment = fm.findFragmentByTag(oldTag); final Fragment fragment = fm.findFragmentByTag(tag); if (oldFragment != null && !tag.equals(oldTag)) { ft.detach(oldFragment); } if (fragment == null) { ft.replace(R.id.container, getContentFragment(tag), tag); } else { if (fragment.isDetached()) { ft.attach(fragment); } } ft.commit(); } Этот кусок кода отдает нужный фрагмент по тагу. private Fragment getContentFragment(String tag) { Fragment fragment = null; if (Frag1.TAG.equals(tag)) { fragment = new Frag1(); } else if (Frag2.TAG.equals(tag)) { fragment = new Frag2(); } return fragment; } А вот так все запускаем: @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { showFragment(getTagById(item.getItemId())); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; }

четверг, 23 января 2020 г.

Как убрать рамку вокруг формы DialogFragment?

#java #android #dialogfragment #android_dialog


У меня есть DialogFragment которому я передаю кастомный layout для показа. 

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



все вроде как и хотелось, но почему этот фон появляется сверху и снизу формы?

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

Я добавил кастомную тему, бекграунд как мне нужно и установил тему в манифесте для
этого активити... 

Но в этой ситуации, я ж не могу установить кастомную тему в манифесте для layout
который передаю в DialogFragment , так как в манифесте только активити... 

Я пробовал присвоить тему самому DialogFragment.

Вот моя тема для него, которая описывает анимацию






и вот так я добавляю в нее те параметры которые мне помогли ранее когда была проблема
с активити получается вот так






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

Как избавиться от этих кусков сверзу и снизу формы?

Поправка:

Как стало понятно, проблема в следующем... У меня стоит анимация на этом диалоге
и реализую я ее через установку стилей, когда создаю билдер

вот так

AlertDialog.Builder adb = new AlertDialog.Builder(getActivity(), R.style.DialogFragmentTheme);


и тогда анимация работает отлично. Если устанавливать R.style.DialogFragmentTheme
через метод onResume(), или в XML файле или в перелпределенном методе getTheme(), то
анимация не работает. Но зато если не работает анимация то срабаьывает метод 

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));


и нет никакой рамки вокруг диалога. Но тогда не работает анимация...

Как можно сделать так, чтоб и анимация работала и рамки вокруг не было?
    


Ответы

Ответ 1



Попробуйте в DialogFragment прописать @Override public void onResume() { super.onResume(); getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.DialogFragmentTheme); }

Ответ 2



Предлагаю использовать Activity вместо DialogFragment. В файл AndroidManifest.xml добавьте новый стиль, с настройкой прозрачного фона для Активности Ниже приведен стиль для Activity с спрозрачным фоном, т. е. у вас автоматом уже не будет стандартной рамки от DialogFragment. Добавить актовность на экран: Intent demoActivity = new Intent(this, DemoActivity.class); startActivity(demoActivity);

четверг, 2 января 2020 г.

Существует пример реализации ViewPager внутри DialogFragmen?

#android #android_viewpager #dialogfragment


Есть примеры кода реализации ViewPager внутри какого либо DialogFragment?
Находил некоторые примеры, но каждый раз возникали разные ошибки которые не позволяли
понять в чем все таки проблема, по сему прошу полный пример от и до содержащий по возможности xml
    


Ответы

Ответ 1



Tab_1.class public class Tab_1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_1, container, false); } } Tab_2.class public class Tab_2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_2, container, false); } } Tab_3.class public class Tab_3 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_3, container, false); } } tab_1.xml tab_2.xml tab_3.xml MainActivity.class Кнопка вызова кастомного диалога. public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onClick(View v){ new FragmentsPopup().show(getSupportFragmentManager(), ""); } } activity_main.xml

воскресенье, 22 декабря 2019 г.

Как передать/получить данные в/из диалогового фрагмента DatePicker

#java #android #android_fragment #dialogfragment


Есть диалоговый фрагмент:

public class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
    @Override public Dialog onCreateDialog(Bundle savedInstanceState)
    {
    // устанавливаем дату, которая отображается в диалоговом окне
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(getActivity().date_choice_millis);
    int yy = calendar.get(Calendar.YEAR);
    int mm = calendar.get(Calendar.MONTH);
    int dd = calendar.get(Calendar.DAY_OF_MONTH);
    return new DatePickerDialog(getActivity(), this, yy, mm, dd);
    }
    public void onDateSet(DatePicker view, int yy, int mm, int dd)
    {
    // получаем выбранную в диалоговом окне дату и сохраняем ее
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.DAY_OF_MONTH, dd);
    calendar.set(Calendar.MONTH, mm);
    calendar.set(Calendar.YEAR, yy);
    getActivity().date_choice_millis = calendar.getTimeInMillis();
    }
}


И несколько Окон (Activity), обращающихся к нему. В каждом Окне есть метод, вызывающий
диалоговый фрагмент:

public void onclick_date_view (View view)
{
    DialogFragment newFragment = new SelectDateFragment();
    newFragment.show(getSupportFragmentManager(), "DatePicker");

    действия после выбора новой даты ...// Возможно, действия после обновления должны
происходить в другом месте?
}


Конструкция getActivity().date_choice_millis (переменная из вызвавшего класса) не
работает. Как получить и передать данные из/в вызвавшее Окно?
    


Ответы

Ответ 1



Пример из моего проекта - передача из фрагмента в DatePicker и возврат результата в фрагмент. Способ корректно переносит повороты устройства и тп. бедствия: UPD: в связи с исключением метода getCalendarView() из Material-стиля календаря переписал получение введенной даты из переданных в колбэк параметров Класс Date Picker: public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{ @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Long mDate = getArguments().getLong("date"); final Calendar c = Calendar.getInstance(); c.setTimeInMillis(mDate); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); return new DatePickerDialog(getActivity(), this, year, month, day); } @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { Calendar с = Calendar.getInstance(); с.set(year,monthOfYear,dayOfMonth); long date = c.getTimeInMillis(); Intent i = new Intent(); i.putExtra ("date" , date); getTargetFragment().onActivityResult(getTargetRequestCode() , Activity.RESULT_OK , i); } } Часть фрагмента, в котором по нажатию на поле TextView (vDate) появляется Date Picker, получение результата, а так же вывод полученной даты в поле TextView, по которому кликали: public class EditTransactionFragment extends Fragment { private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM); private TextView vDate; private final int CHANGE_DATE = 2; Transaction mTransaction; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); if (mTransaction == null) mTransaction = new Transaction(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { long mDate; View view = inflater.inflate(R.layout.edit_transaction, null); mDate = mTransaction.getDate(); vDate = (TextView) view.findViewById(R.id.tr_date); vDate.setOnClickListener(new DateClickListener(mDate)); setTextDate(mDate); return view; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (data == null || resultCode != Activity.RESULT_OK) return; switch (requestCode) { case CHANGE_DATE: Long date = data.getLongExtra("date", 0); mTransaction.setDate(date); setTextDate(date); return; } } private void setTextDate(Long date) { vDate.setText(dateFormat.format(date)); } private class DateClickListener implements View.OnClickListener { private long mDate; public DateClickListener(long date) { mDate = date; } @Override public void onClick(View v) { DialogFragment changeDate = new DatePickerFragment(); Bundle args = new Bundle(1); args.putLong("date", mDate); changeDate.setArguments(args); changeDate.setTargetFragment(EditTransactionFragment.this, CHANGE_DATE); changeDate.show(getFragmentManager(), "changeDate"); } } }

суббота, 21 декабря 2019 г.

Как убрать заголовок диалога

#android #dialogfragment


Как вызвать что-нибудь диалоговое без ActionBar, чтобы высвечивался только layout
файл. Варианты со скрытием\убийством ActionBar\изменением темы Activity``DialogFragment``
(если можно) тоже подойдут.

Попытки, которые я пробовал, но ничего не вышло:


Сделать Activity с темами @android:style/Theme.Dialog.NoTitleBar и @android:style/Theme.NoTitleBar.Dialog.
Сделать Activity с темами @android:style/Theme.Dialog.NoTitleBar и @android:style/Theme.NoTitleBar.Dialog.
Сделать DialogFragment, а потом убрать, скрыть ActionBar — оказывается у DialogFragment
нет ActionBar (по крайней мере, getActionBar не рработает).
Сделать свой style с Dialog и NoTitleBar. Тут совсем ничего не вышло.


Помогите, пожалуйста!
    


Ответы

Ответ 1



Вот один из вариантов решения Вашей задачи: Если используете Dialog: Dialog dialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.my_dialog_la); dialog.show(); Если расширяете DialogFragment, то в onCreate добавьте следующую строку: setStyle(STYLE_NO_TITLE, 0);

Ответ 2



У меня работает такой вариант. Activity диалогового окна: public class ActivityLikeADialogue extends AppCompatActivity { Button btnOk; TextView textDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_alert_dialogue); textDialog = (TextView)findViewById(R.id.text_dialog) ; textDialog.setText("Hello, I'm the dialog text!"); btnOk = (Button) findViewById(R.id.button_dialog); btnOk.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } } Manifest: Style: UPD: Полный пример на гитхаб залил. UPD2: А вот так оно смотрится:

понедельник, 16 декабря 2019 г.

Как не хардкодно расширить прозрачный DialogFragment

#android #android_fragment #dialogfragment


Имеется прозрачный DialogFragment.

public class TempFragment extends DialogFragment {

    static TempFragment newInstance() {
        TempFragment dialogFragment = new TempFragment();
        return dialogFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

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

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);

        final Drawable drawable = new ColorDrawable(-15108398);
        drawable.setAlpha(200);

        dialog.getWindow().setBackgroundDrawable(drawable);
        dialog.getWindow().requestFeature(android.view.Window.FEATURE_NO_TITLE);

        return dialog;
    }

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(1000, 1500);
    }
}


Layout:




    

    


Ответы

Ответ 1



Можно получить размер экрана устройства и использовать его для размеров фрагмента Display display = getActivity().getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); getDialog().getWindow().setLayout(size.x, size.y); Также можно показывать фрагмент в активити, для которого в манифесте:

суббота, 1 июня 2019 г.

Android: правильное использование фрагментов и Navigation Drawer

Я использую в приложении шаблон Navigation Drawer Activity и у меня возникли несколько вопросов по поводу правильного использования его и фрагментов в целом.
Т.к. все страницы (назову фрагменты, открываемые из бокового меню так) приложения - фрагменты в одной активити, то я лишаюсь возможности использовать Intent для переключения активиностей? Как реализовать открытие фрагмента (какой-то страницы) по какому-то действию из другого фрагмента? Сделать интерфейс, напримерIFragmentAction, со всеми событиями, которые могут послать фрагменты, реализовать его у активити и вызывать эти методы из фрагментов? А в них уже делать транзакции? Это правильно? Аналогично, если нужно по действию во фрагменте показать фрагмент, не явлюящийся "страницей" - надо делать аналогично, через активити? Или можно сделать транзакцию прямо из фрагмента (в настоящий момент сделал так, но кажется это немного неправильно) Если нужен режим для планшета, где некоторые фрагменты не открываются поверх старых, а расположены рядом - надо создать новый layouyt еще одну активити, реализующую интерфейс, но с другим поведением? Или это не самый правильный подход? Как правильно вернуть результат из DialogFragment? Я реализовывал интерфейс у фрагмента, который вызывал этот диалог, через который диалог устанавливал нужные значения. Кажется, не лучший подход. Столкнулся с такой проблемой: Если после нескольких смен фрагментов пользователь переходит через боковое меню на другую страницу - он видит несколько наложившихся активностей. Если просто сделать белый фон - задняя активность все равно останется кликабельной.
Как правильно сделать переходы между активностями, чтобы не возникало таких проблем и чтобы это было правильно?


Ответ

Отвечу на всю историю примерным кодом.
Пусть Ваш NavigationDrawer содержит кастомный адаптер для списка. При нажатии в списке на элемент вы к примеру получите йд нужного фрагмента, пусть это будет int, Но лучше строка. Получаем TAG Фрагмента.
private String getTagById(int tagId) { String tag = null; if (Frag1.TAG_ID == tagId) { tag = Frag1.TAG; } else if (Frag2.TAG_ID == tagId) { tag = Frag2.TAG; } return tag; }
Дальше в роль вступает участок кода для работы с фрагментами. В нем мы узнаем совпадает ли активный фрагмент с выбранным, если не совпадает мы сделаем detach активного, проверим открывали ли ранее выбранный и выполним replace или attach
private void showFragment(String tag) { String oldTag = mSelectedTag; mSelectedTag = tag; final FragmentManager fm = getSupportFragmentManager(); final FragmentTransaction ft = fm.beginTransaction(); final Fragment oldFragment = fm.findFragmentByTag(oldTag); final Fragment fragment = fm.findFragmentByTag(tag);
if (oldFragment != null && !tag.equals(oldTag)) { ft.detach(oldFragment); }
if (fragment == null) { ft.replace(R.id.container, getContentFragment(tag), tag); } else { if (fragment.isDetached()) { ft.attach(fragment); } } ft.commit(); }
Этот кусок кода отдает нужный фрагмент по тагу.
private Fragment getContentFragment(String tag) { Fragment fragment = null; if (Frag1.TAG.equals(tag)) { fragment = new Frag1(); } else if (Frag2.TAG.equals(tag)) { fragment = new Frag2(); } return fragment; }
А вот так все запускаем:
@SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { showFragment(getTagById(item.getItemId())); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; }

пятница, 11 января 2019 г.

Существует пример реализации ViewPager внутри DialogFragmen?

Есть примеры кода реализации ViewPager внутри какого либо DialogFragment? Находил некоторые примеры, но каждый раз возникали разные ошибки которые не позволяли понять в чем все таки проблема, по сему прошу полный пример от и до содержащий по возможности xml


Ответ


Tab_1.class
public class Tab_1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_1, container, false); } }
Tab_2.class
public class Tab_2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_2, container, false); } }
Tab_3.class
public class Tab_3 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_3, container, false); } }
tab_1.xml


tab_2.xml


tab_3.xml


MainActivity.class
Кнопка вызова кастомного диалога.
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
public void onClick(View v){ new FragmentsPopup().show(getSupportFragmentManager(), ""); } }
activity_main.xml

среда, 21 ноября 2018 г.

Как передать/получить данные в/из диалогового фрагмента DatePicker

Есть диалоговый фрагмент:
public class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // устанавливаем дату, которая отображается в диалоговом окне Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(getActivity().date_choice_millis); int yy = calendar.get(Calendar.YEAR); int mm = calendar.get(Calendar.MONTH); int dd = calendar.get(Calendar.DAY_OF_MONTH); return new DatePickerDialog(getActivity(), this, yy, mm, dd); } public void onDateSet(DatePicker view, int yy, int mm, int dd) { // получаем выбранную в диалоговом окне дату и сохраняем ее Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_MONTH, dd); calendar.set(Calendar.MONTH, mm); calendar.set(Calendar.YEAR, yy); getActivity().date_choice_millis = calendar.getTimeInMillis(); } }
И несколько Окон (Activity), обращающихся к нему. В каждом Окне есть метод, вызывающий диалоговый фрагмент:
public void onclick_date_view (View view) { DialogFragment newFragment = new SelectDateFragment(); newFragment.show(getSupportFragmentManager(), "DatePicker");
действия после выбора новой даты ...// Возможно, действия после обновления должны происходить в другом месте? }
Конструкция getActivity().date_choice_millis (переменная из вызвавшего класса) не работает. Как получить и передать данные из/в вызвавшее Окно?


Ответ

Пример из моего проекта - передача из фрагмента в DatePicker и возврат результата в фрагмент. Способ корректно переносит повороты устройства и тп. бедствия:
UPD: в связи с исключением метода getCalendarView() из Material-стиля календаря переписал получение введенной даты из переданных в колбэк параметров
Класс Date Picker:
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { Long mDate = getArguments().getLong("date"); final Calendar c = Calendar.getInstance(); c.setTimeInMillis(mDate); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), this, year, month, day); }
@Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Calendar с = Calendar.getInstance(); с.set(year,monthOfYear,dayOfMonth); long date = c.getTimeInMillis(); Intent i = new Intent(); i.putExtra ("date" , date); getTargetFragment().onActivityResult(getTargetRequestCode() , Activity.RESULT_OK , i);
} }
Часть фрагмента, в котором по нажатию на поле TextView (vDate) появляется Date Picker, получение результата, а так же вывод полученной даты в поле TextView, по которому кликали:
public class EditTransactionFragment extends Fragment {

private final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM); private TextView vDate; private final int CHANGE_DATE = 2; Transaction mTransaction;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setRetainInstance(true); if (mTransaction == null) mTransaction = new Transaction(); }
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { long mDate;
View view = inflater.inflate(R.layout.edit_transaction, null);
mDate = mTransaction.getDate(); vDate = (TextView) view.findViewById(R.id.tr_date); vDate.setOnClickListener(new DateClickListener(mDate)); setTextDate(mDate); return view; }
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);
if (data == null || resultCode != Activity.RESULT_OK) return;
switch (requestCode) { case CHANGE_DATE: Long date = data.getLongExtra("date", 0); mTransaction.setDate(date); setTextDate(date); return; } }
private void setTextDate(Long date) { vDate.setText(dateFormat.format(date)); }
private class DateClickListener implements View.OnClickListener { private long mDate;
public DateClickListener(long date) { mDate = date; }
@Override public void onClick(View v) { DialogFragment changeDate = new DatePickerFragment(); Bundle args = new Bundle(1); args.putLong("date", mDate); changeDate.setArguments(args); changeDate.setTargetFragment(EditTransactionFragment.this, CHANGE_DATE); changeDate.show(getFragmentManager(), "changeDate"); } } }

пятница, 9 ноября 2018 г.

Как убрать заголовок диалога

Как вызвать что-нибудь диалоговое без ActionBar, чтобы высвечивался только layout файл. Варианты со скрытием\убийством ActionBar\изменением темы Activity``DialogFragment`` (если можно) тоже подойдут.
Попытки, которые я пробовал, но ничего не вышло:
Сделать Activity с темами @android:style/Theme.Dialog.NoTitleBar и @android:style/Theme.NoTitleBar.Dialog Сделать Activity с темами @android:style/Theme.Dialog.NoTitleBar и @android:style/Theme.NoTitleBar.Dialog. Сделать DialogFragment, а потом убрать, скрыть ActionBar — оказывается у DialogFragment нет ActionBar (по крайней мере, getActionBar не рработает). Сделать свой style с Dialog и NoTitleBar. Тут совсем ничего не вышло.
Помогите, пожалуйста!


Ответ

Вот один из вариантов решения Вашей задачи:
Если используете Dialog
Dialog dialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.my_dialog_la); dialog.show(); Если расширяете DialogFragment, то в onCreate добавьте следующую строку:
setStyle(STYLE_NO_TITLE, 0);