Форум программистов, компьютерный форум CyberForum.ru

Вложенные фрагменты - Android

Восстановить пароль Регистрация
 
Waspp
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 10
01.03.2016, 19:40     Вложенные фрагменты #1
Ребятушки, привет. У меня проблема с вложенными фрагментами. Мое приложение построено так: есть одно главное Activity, а также NawigationDrawer, через который я перехожу на разные фрагменты. Все переходит без проблем. Но вот у меня есть пара фрагментов, через которые я перехожу на еще один фрагмент (фрагмент во фрагменте получается). Что-то типа первый фрагмент со списком новостей, жмешь на какую-либо новость открывается еще один фрагмент с этой одиночной новостью. Все бы ничего, да вот когда жму кнопку назад (телефонную), фрагменты начинают жутко накладываться друг на друга. Если использовать при переходе из фрагмента во фрагмент ChildFragmentManager наложения нет, но тогда я не могу из вложенного фрагмента вернуться в начальный фрагмент. Если использовать FragmentManager, то идет наложение. Кто-нибудь может уже сталкивался с подобной проблемой? Как правильно реализовать вложенный фрагмент?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
02.03.2016, 10:42     Вложенные фрагменты #2
Waspp, удобнее же в отдельной активити показать саму новость и проблем не будет.
Waspp
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 10
02.03.2016, 10:57  [ТС]     Вложенные фрагменты #3
Цитата Сообщение от Spelcrawler Посмотреть сообщение
удобнее же в отдельной активити показать саму новость и проблем не будет.
В таком случае в этом Activity не будет перехода на меню в NawigationDrawer. Хотелось бы, чтобы выход в меню был во всех страницах приложения
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
02.03.2016, 11:02     Вложенные фрагменты #4
Ну это не правильно же - там по идее кнопка назад должна быть.
Waspp
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 10
02.03.2016, 12:19  [ТС]     Вложенные фрагменты #5
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Ну это не правильно же - там по идее кнопка назад должна быть.
А почему не правильно? В приложении вк же так реализовано
Паблито
не спать!
1882 / 1616 / 500
Регистрация: 12.05.2014
Сообщений: 5,836
Завершенные тесты: 1
02.03.2016, 12:22     Вложенные фрагменты #6
код бы увидеть
Waspp
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 10
02.03.2016, 12:28  [ТС]     Вложенные фрагменты #7
Код родительского фрагмента
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using AppRsue003;
using AppRsueAndroid.DataModel;
using LibraryRsue003;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
 
namespace AppRsueAndroid.Fragments
{
    public class NewsFragment : Android.Support.V4.App.Fragment
    {
        private static View view;
        private readonly string uriNews = "news?limit=20";
        private string uriSingleNews = string.Empty;
 
        const string ATTRIBUTE_MAIN_TEXT = "textMain";
        const string ATTRIBUTE_NAME_DATE = "date";
        ListView lvNews;
        private float mLastPosY;
        private FrameLayout mChild_fragment_news;
 
        ObservableCollection<NewsRsue> news = new ObservableCollection<NewsRsue>();
        public async override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
 
            string jsonText = await ToolsRsue.LoadFromIsolatedStorage(ParseObjectToJson.newsDataFileName, Application.Context);
 
            if (jsonText != "")
            {
                // Список новостей
                news = (ObservableCollection<NewsRsue>)await NewsDataSource.GetNewsAsync(jsonText);
            }
            else
            {
                string newsJson = await ParseObjectToJson.DownLoadHtmlAsync(uriNews);
 
                if (newsJson != "-1")
                {
                    // Сохранение Json-файла новостей в изолированном хранилище устройства
                    ToolsRsue.SaveToIsolatedStorage(newsJson, ParseObjectToJson.newsDataFileName, Application.Context);
 
                    news = (ObservableCollection<NewsRsue>)await NewsDataSource.GetNewsAsync(newsJson);
                }
                else
                {
                    Toast.MakeText(Application.Context, "Соединение с интернетом отсутствует", ToastLength.Long).Show();
                }
            }
 
            // Упаковываем данные в понятную для адаптера структуру
            IList<IDictionary<string, object>> data = new List<IDictionary<string, object>>(news.Count);
            JavaDictionary<string, object> m;
            string data_string;
            for (int i = 0; i < news.Count; i++)
            {
                m = new JavaDictionary<string, object>();
 
                DateTime dt = Convert.ToDateTime(news[i].Data);
                data_string = dt.ToString("dd MMM \nyyyy г.");
 
                m.Add(ATTRIBUTE_MAIN_TEXT, news[i].Title);
                m.Add(ATTRIBUTE_NAME_DATE, data_string);
                data.Add(m);
            }
 
            // Массив имен атрибутов, из которых будут читаться данные
            string[] from = { ATTRIBUTE_MAIN_TEXT, ATTRIBUTE_NAME_DATE };
 
            // Массив ID View-компонентов, в которые будут вставляться данные
            int[] to = { Resource.Id.tvNewsTitle, Resource.Id.tvNewsDate };
 
            // Создаем адаптер
            SimpleAdapter sAdapter = new SimpleAdapter(Application.Context, data, Resource.Layout.ListViewSingleNews, from, to);
 
            // Присваиваем адаптер списку
            lvNews.Adapter = sAdapter;
 
 
 
 
           
 
        }
 
        
        public  override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            
            LayoutInflater lf = Activity.LayoutInflater;
            view = lf.Inflate
 
    (Resource.Layout.News, container, false);
 
            lvNews = view.FindViewById<ListView>(Resource.Id.listViewNews);
           // mChild_fragment_news = view.FindViewById<FrameLayout>(Resource.Id.child_fragment_news);
            lvNews.ItemClick += (object sender, AdapterView.ItemClickEventArgs e) =>
            {
                Android.Support.V4.App.FragmentTransaction tx = FragmentManager.BeginTransaction();
                ItemNewsFragment fragment = new ItemNewsFragment();
                NewsFragment newss = new NewsFragment();
                Bundle bundle = new Bundle();
                bundle.PutString("Id", news[(int)e.Id].Id);
                fragment.Arguments = bundle;
               
                tx.Replace(Resource.Id.child_fragment_news, fragment);
 
                tx.AddToBackStack(null);
                //this.ChildFragmentManager.ExecutePendingTransactions();
                tx.Commit();
                //this.ChildFragmentManager.ExecutePendingTransactions();
 
            };
            return view;
        }
    
        
        
 
    }
}
Добавлено через 2 минуты
Код вложенного фрагмента
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using LibraryRsue003;
using Android.Text;
using AppRsueAndroid.DataModel;
 
namespace AppRsueAndroid.Fragments
{
    public class ItemNewsFragment : Android.Support.V4.App.Fragment
    {
        private static View view;
        TextView tvItemNewsDate, tvItemNewsTitle, tvItemNewsDesc;
        NewsRsue item;
        public async override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
 
           
 
 
            string newsHtml = await ParseObjectToJson.DownLoadHtmlAsync("news/" + Arguments.GetString("Id"));
 
            if (newsHtml != "-1")
            {
                item = await NewsItemDataSource.GetNewsItemAsync(newsHtml);
            }
            else
            {
                Toast.MakeText(Application.Context, "Соединение с интернетом отсутствует", ToastLength.Long).Show();
                item = new NewsRsue("0", "Нет соединения с интернетом", "", "", "", "");
            }
        
            // Заполняем элементы данными
            DateTime dt = Convert.ToDateTime(item.Data);
            tvItemNewsDate.Text = dt.ToString("dd MMMM yyyy г."); ;
            tvItemNewsTitle.Text = item.Title;
 
            // Обрабатываем HTML теги
            tvItemNewsDesc.Text = Html.FromHtml(item.Content).ToString();
            // Create your fragment here
        }
        
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
 
            LayoutInflater lf = Activity.LayoutInflater;
            view = lf.Inflate(Resource.Layout.ItemNews, container, false);
            tvItemNewsDate = view.FindViewById<TextView>(Resource.Id.tvItemNewsDate);
            tvItemNewsTitle = view.FindViewById<TextView>(Resource.Id.tvItemNewsTitle);
            tvItemNewsDesc = view.FindViewById<TextView>(Resource.Id.tvItemNewsDesc);
           // lvAddress = view.FindViewById<ListView>(Resource.Id.listViewAddress);
 
            return view;
        }
    }
}
Паблито
02.03.2016, 12:37
  #8

Не по теме:

читать код С# я пас
помню когда-то проверял вложенные фрагменты и там точно надо использовать getChildFragmentManager()

Waspp
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 10
02.03.2016, 12:40  [ТС]     Вложенные фрагменты #9
Цитата Сообщение от Паблито Посмотреть сообщение
там точно надо использовать getChildFragmentManager()
В том то и суть, что если Child использовать, то фрагменты тогда как бэ склеиваются, и нет возможности вернуться на родительский фрагмент кнопкой back
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2016, 12:47     Вложенные фрагменты
Еще ссылки по теме:

Android Как добавить фрагменты в Tabbed Activity (Андроид Студио)?
Android Не могу разобраться, как подключать Фрагменты
BackStack и Фрагменты Android
Android Фрагменты: приложение вылетает при 4-ом нажатии на кнопку
Как листать фрагменты в ViewPager по кнопке? Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Паблито
02.03.2016, 12:47     Вложенные фрагменты
  #10

Не по теме:

вспомнил, я писал тогда не очень красивые конструкции с всякими popBackStack и проверками в onBackPressed количества фрагментов в стеке и так далее
вобщем остался неприятный осадок )
может есть и более простой способ

Yandex
Объявления
02.03.2016, 12:47     Вложенные фрагменты
Ответ Создать тему
Опции темы

Текущее время: 12:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru