Topic: Fragment (Фрагменты)

Обсуждение статьи Fragment (Фрагменты)

Re: Fragment (Фрагменты)

Интересный цикл статей, многое стало на места.   

Я попробовал анимацию вида
                                                                 
fr.beginTransaction().replace(R.id.container, new TypeFrag(), "type")
                .addToBackStack("type")
                .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
                .commit();

и ничего нет. А должно работать?

Кстати как управлять такой анимацией - duration и пр?

Re: Fragment (Фрагменты)

Здравствуйте!
Данный метод вызывает конфликт android.app.FragmentManager; и android.support.v4.app.Fragment;
@Override
public void count(String data) {
    FragmentManager manager = getSupportFragmentManager();
    WithTextViewFragment withTextViewFragment =
            (WithTextViewFragment) manager.findFragmentById(R.id.fragment_withTextView);
    withTextViewFragment.changeText(data);
}

Пробовал переделать так:
public void count(String data) {
        FragmentManager manager = getFragmentManager();
        WithTextViewFragment withTextViewFragment =
                (WithTextViewFragment) manager.findFragmentById(R.id.fragment2);
        withTextViewFragment.changeText(data);
    }
Но тогда ругается на WithTextViewFragment. Как  сделать лучше чтобы избежать конфликта старой и новой библиотеки FragmentManager?

Re: Fragment (Фрагменты)

Я не встречал проблем, если фрагменты используются из одной библиотеки. Поэтому просто приведите все к одному знаменателю.

Re: Fragment (Фрагменты)

Да, когда поставил везде одну библиотеку ошибки ушли.
Теперь крашится при запуске:

Unable to start activity ComponentInfo{com.example.ant_design.fragment5/com.example.ant_design.fragment5.MainActivity}: android.view.InflateException: Binary XML file line #16: Error inflating class fragment

Т.е. почему-то не надувается фрагмент с кнопкой, если его удалить из activity_main.xml то запускается.
Ума не приложу что там может быть не так....

fragment_with_button.xml прост до безобразия, сам код фрагмента в activity_main.xml тоже не бином Ньютона.
Сейчас буду экспериментировать

6 (edited by ivan 2016-12-22 18:02:44)

Re: Fragment (Фрагменты)

Подтверждаю проблему onCreateView с двумя версиями кода: вариант с "View rootView" работает отлично, а вот "Button button" не даёт скомпилить прогу.

Видимо, мы зря ищем "button" в "container" до вызова "inflate".. её там нет.

Первые 4 статьи по "фрагментам" компилялись на ура.. А вот 5-ая прямо забуксовала.. Лучше укажите, чтобы писали с нуля.. А то старый код по сути весь приходится удалять (

Re: Fragment (Фрагменты)

Там были просто опечатки. Я заново прошел урок и поправил те моменты, которые вызывали ошибку. Не вижу ничего страшного, если приходится что-то удалять из проекта. Это учебные примеры, лучше будете ориентироваться в коде, когда будете анализировать, что вызывает ошибку.

Re: Fragment (Фрагменты)

Добрый день, коллеги.
Никто не поможет мне разобраться в небольшом вопросе взаимодействия фрагмента и BottomNavigationView? Дело в том, что использую стандартную Bottom Navigation Activity (с 3-мя кнопками внизу экрана).  По умолчанию – при нажатии на кнопки изменяется текст. Я хочу, чтобы при нажатии на кнопку – появлялся фрагмент. Но, когда написал код, то некорректно отображается эта панель с кнопками: эта панель оказывается вверху, а не снизу, как по умолчанию.
 

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

Вот главный код:
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView mTextMessage;

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
            = new BottomNavigationView.OnNavigationItemSelectedListener() {

        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Fragment fragment = null;
            Class fragmentClass = null;

            int id = item.getItemId();

            if (id == R.id.navigation_home) {
                fragmentClass = BiografyClass.class;
            } else if (id == R.id.navigation_dashboard) {
                fragmentClass = PhotoFragment.class;

            } else if (id == R.id.navigation_notifications) {
                fragmentClass = PhotoFragment.class;

            }

            try {
                fragment = (Fragment) fragmentClass.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }

            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
           
            setTitle(item.getTitle());

            return true;
        }

    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextMessage = (TextView) findViewById(R.id.message);
        BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
    }

Activity_main:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.butam.biografy4.MainActivity">



    <LinearLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
    <fragment
        android:id="@+id/fragment"
        android:name="com.example.butam.biografy4.BiografyClass"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal"
        />


</LinearLayout>

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="?android:attr/windowBackground"
        app:menu="@menu/navigation" />


</LinearLayout>

Fragment_biografy.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.butam.biografy4.MainActivity">

        <LinearLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1">

                <TextView
                    android:id="@+id/message"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                    android:layout_marginLeft="@dimen/activity_horizontal_margin"
                    android:layout_marginRight="@dimen/activity_horizontal_margin"
                    android:layout_marginTop="@dimen/activity_vertical_margin"
                    android:text="Тут Текст 1" />


        </LinearLayout>



</LinearLayout>


BiografyClass.java:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;



public class BiografyClass extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {

        View rootView =
                inflater.inflate(R.layout.fragment_biografy, container, false);
        return rootView;

    }

}

Если переходить на другую активность с помощью интента или просто выводить текст, то все корректно отображается. С фрагментами никак пока не разберусь.

Re: Fragment (Фрагменты)

Mish, нашел ошибку.
В классе главной активности:

fragmentManager.beginTransaction().replace(R.id.content, fragment).commit(); // "R.id.content", а у Вас "R.id.container"

Умаялся искать, если честно)

Re: Fragment (Фрагменты)

NeferSky, спасибо большое! Приду домой  посмотрю! Спасибо еще раз!

11 (edited by Mish 2017-09-03 22:45:09)

Re: Fragment (Фрагменты)

NeferSky, спасибо еще раз. Правда, когда вставил content, менюшка была сверху, но при нажатии на все кнопки отображался только один первый фрагмент (т.е. не менялся). Я заменил content на fragment в главной активности. Теперь все работает! Спасибо, все корректно отображается. Подсказал мне, в каком направлении думать!

Re: Fragment (Фрагменты)

Добрый день. Можно ли каким-то образом использовать один фрагмент для нескольких активностей? Ну например, некий фрагмент - синглтон.

Re: Fragment (Фрагменты)

Xiri wrote:

Добрый день. Можно ли каким-то образом использовать один фрагмент для нескольких активностей? Ну например, некий фрагмент - синглтон.

Да можно, почему бы и нет... Простой учебный вариант - написать класс фрагмента, и создавать его экземпляры в любых активностях, каких захотите.
Сложный вариант реализации синглетона... Ну, навскидку - описать в классе фрагмента статический метод, возвращающий экземпляр фрагмента. В методе проверять - "если не создан то создать" и возвращать экземпляр... а, ну и внутри класса ссылку на созданный экземпляр тоже сохранять куда-нибудь... Убиваца экземпляр будет, наверное, самостоятельно, java многое прощает в плане чистки мусора... Хотя, тут надо бы проверить - если экземпляр фрагмента никем не используется, то может убица самостоятельно...
Вот. Абстрактный вопрос - абстрактный ответ))

Re: Fragment (Фрагменты)

Привет. Такой вопрос:
Есть поле в базе типа long в котором хранится дата в формате UTC. Для вывода использую ListFragment совместно с SimpleCursorAdapter. Возможно ли при выводе как-то форматировать дату для приведения ее к удобочитаемому виду?

Re: Fragment (Фрагменты)

В Java есть классы для работы с датами http://developer.alexanderklimov.ru/and … a/date.php Изучите этот вопрос.

Re: Fragment (Фрагменты)

Задействовать классы для преобразования дат - это понятно, непонятно в какой момент их задействовать.
Я использую метод query наследника SQLiteOpenHelper для получения курсора, который подставляю в конструктор SimpleCursorAdapter, туда же подставляются массив имен колонок откуда будут браться данные и массив имен полей раскладки, в которой они будут отображаться. Непосредственно данными я не оперирую. Если я правильно понимаю SimpleCursorAdapter сам получает данные и помещает их в ListFragment. Возможно ли как-то указать адаптеру, что данные перед выводом надо как-то обработать или здесь требуется совершенно иной подход?