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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Waspp
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 13
#1

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

01.03.2016, 19:40. Просмотров 601. Ответов 9
Метки нет (Все метки)

Ребятушки, привет. У меня проблема с вложенными фрагментами. Мое приложение построено так: есть одно главное Activity, а также NawigationDrawer, через который я перехожу на разные фрагменты. Все переходит без проблем. Но вот у меня есть пара фрагментов, через которые я перехожу на еще один фрагмент (фрагмент во фрагменте получается). Что-то типа первый фрагмент со списком новостей, жмешь на какую-либо новость открывается еще один фрагмент с этой одиночной новостью. Все бы ничего, да вот когда жму кнопку назад (телефонную), фрагменты начинают жутко накладываться друг на друга. Если использовать при переходе из фрагмента во фрагмент ChildFragmentManager наложения нет, но тогда я не могу из вложенного фрагмента вернуться в начальный фрагмент. Если использовать FragmentManager, то идет наложение. Кто-нибудь может уже сталкивался с подобной проблемой? Как правильно реализовать вложенный фрагмент?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2016, 19:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вложенные фрагменты (Программирование Android):

BackStack и Фрагменты - Программирование Android
Из активити запускаю Фрагмент А, из Фрагмента А запускаю фрагмент Б, из Фрагмента Б запускаю фрагмент В. Если добавлять каждый фрагмент в...

Фрагменты в Android - Программирование Android
Здравствуйте, появилась необходимость использования фрагментов, и тут возник вопрос: как использовать фрагмент несколько раз на одном...

Фрагменты и данные - Программирование Android
Добрый день, подскажите пожалуйста такую вещь, как можно передать из активити во фрагмент какой-то массив данных ну допустим...

Заменить Активити на Фрагменты - Программирование Android
Задумался над тем, чтобы заместо каждого Activity(у меня их 17 в приложении на данный момент) использовать фрагменты. Создать 1 главную...

SlidingTab - фрагменты с RecycleView (ListView) - Программирование Android
Здравствуйте, уважаемые разработчики. Из мануала хочу сделать так, что бы на каждой странице были разные RecycleView или ListView (например...

Фрагменты наслаиваются друг на друга - Программирование Android
Добрый день. Не пойму почему фрагменты наслаиваются друг на друга В main активити в onCreate включается первый фрагмент, чтобы чтото...

9
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
02.03.2016, 10:42 #2
Waspp, удобнее же в отдельной активити показать саму новость и проблем не будет.
0
Waspp
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 13
02.03.2016, 10:57  [ТС] #3
Цитата Сообщение от Spelcrawler Посмотреть сообщение
удобнее же в отдельной активити показать саму новость и проблем не будет.
В таком случае в этом Activity не будет перехода на меню в NawigationDrawer. Хотелось бы, чтобы выход в меню был во всех страницах приложения
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
02.03.2016, 11:02 #4
Ну это не правильно же - там по идее кнопка назад должна быть.
0
Waspp
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 13
02.03.2016, 12:19  [ТС] #5
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Ну это не правильно же - там по идее кнопка назад должна быть.
А почему не правильно? В приложении вк же так реализовано
0
Pablito
2476 / 1960 / 611
Регистрация: 12.05.2014
Сообщений: 6,866
Завершенные тесты: 1
02.03.2016, 12:22 #6
код бы увидеть
0
Waspp
0 / 0 / 0
Регистрация: 27.12.2015
Сообщений: 13
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;
        }
    }
}
0
Pablito
02.03.2016, 12:37
  #8

Не по теме:

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

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

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2016, 12:47
Привет! Вот еще темы с ответами:

Как листать фрагменты в ViewPager по кнопке? - Программирование Android
Доброго дня. Есть фрагменты, Листаемые в ViewPager'е. Помимо возможности перелистывания фрагментов жестами (и в шапке, во вкладках)...

Не могу разобраться, как подключать Фрагменты - Программирование Android
Решил научится использовать фрагменты, и сразу же наткнулся на проблему (Не могу понять как их подключать) Использовал готовый шаблон...

Фрагменты: приложение вылетает при 4-ом нажатии на кнопку - Программирование Android
Здравствуйте, в фрагменте есть кнопка, при нажатии на неё 3 раза приложение работает, на 4 вылетает, и пишет, что это из-за (View v =...

При смене ориентации экрана накладываются фрагменты - Программирование Android
Юзаю Android.Support.V4.App.Fragment, вроде бы все нормально. При переключении из меню фрагменты скрываю отправляя в &quot;стек&quot; а кликнутый...


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

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

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