Урок 106. Android 3. Fragments. Взаимодействие с Activity

Обсуждение уроков
Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение doter.ua » 01 дек 2014, 14:10

finberg писал(а):
Pedro Sancez писал(а): без участии активити
почему избегаешь активити?
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Pedro Sancez
Сообщения: 4
Зарегистрирован: 03 ноя 2014, 17:20

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Pedro Sancez » 01 дек 2014, 21:47

В общем не буду ходить вокруг-да около. Кроме как у Вас, мне спросить не у кого.(За это вам ОГРОМНЕЙШАЯ БЛАГОДАРНОСТЬ!) В общем мне нужно написать примитивную программу, управляющую локальной базой данных пользователей.
Регистрация/авторизация пользователей, чтение/изменение/сохранение личных данных, просмотр списка пользователей в базе.
Данные - логин/пароль, имя, контактные данные (email, www, телефон). Вот код главной Activity, а все действия -ввод данных(авторизация, регистрация, просмотр и т.д) будет происходить во фрагментах, которые должны динамически менять друг друга. Но вот беда - я не знаю, как получить доступ к базе данных, объявленной в Activity из фрагментов, чтобы в них полноценно работать с ней. Может я в чём-то не прав? Может это бред, и можно как то иначе всё сделать? Буду ОЧЕНЬ признателен за совет!

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

public class MainActivity extends Activity {
	
    private Fragment fragment1, fragment2,fragment3;
    private FragmentTransaction ft;
    Button btn;
    MyHelper my;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        my = new MyHelper(this);
        SQLiteDatabase db= my.getWritableDatabase();
        fragment1= new Fragment1();
        fragment2= new Fragment2();
        fragment3= new Fragment3();
        ft = getFragmentManager().beginTransaction();
        //ft.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_in_right);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.replace(R.id.fragCont, fragment1);
        ft.addToBackStack(null);
        ft.commit();
        
        btn =(Button)findViewById(R.id.btn);
        
        btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
		        ft = getFragmentManager().beginTransaction();
		        //ft.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_in_right);
			ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
		        if(fragment1.isVisible()){
		            ft.replace(R.id.fragCont, fragment2);
		        }
		         if  (fragment2.isVisible())
		        {
		            ft.replace(R.id.fragCont, fragment3);
		        }
		         if (fragment3.isVisible()) {
			            ft.replace(R.id.fragCont, fragment1);
			        }
		        ft.commit();
			}	
        });
        
    }

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

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Foenix » 01 дек 2014, 21:53

работать с б.д. можно по-разному. Например, с помощью контент-провайдеров. По этой теме был вебинар. Посмотри для начала его. Я там освещала самые важные вопросы и по возможности коротко.
R.id.team

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

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение doter.ua » 02 дек 2014, 01:17

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

public static DBConnector mDB; // твой класс, наследующий SQLiteOpenHelper
private SQLiteDatabase db;

...

Один раз в приложении открываешь:
mDB = new DBConnector(this, имя базы); // не помню стандартный это конструктор или нет, скорее всего рукописный)
db = mDB.getWritableDatabase();

потом используешь ИмяАктивити.mDB или ИмяАктивити.db в других местах.
Конечно если БД используется очень редко, то лучше открывать\закрывать такие соединения только при необходимости, а не оставлять открытыми все время.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

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

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Foenix » 02 дек 2014, 09:56

а я там по-моему три способа, включая синглтон, упоминаю. Статик нет, лучше не делать.
Просто к.п. самый продвинутый на сегодняшний момент способ. Он уже и не новый совсем. Да и реализовывать несложно, надо только разобраться. Зато открывает перспективы большие, т.к. к.п. связан с реализацией несколько очень полезных паттернов в андроиде (в связке с другими классами).
R.id.team

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

Pedro Sancez
Сообщения: 4
Зарегистрирован: 03 ноя 2014, 17:20

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Pedro Sancez » 03 дек 2014, 23:40

Помогите пожалуйста в следующем вопросе. Мне нужно вывести в листвью, которое находится во фрагменте, базу данных. Я в адаптерах не силён, естественно конструктор ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, str); во фрагменте не работает. Как можно исправить это? Как ещё можно вывести бд из активити во фрагмент???

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

public class Fragment3 extends Fragment {
        ListView lv;
        SQLiteDatabase db;
        ArrayList<String> str;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                                Bundle savedInstanceState) {
        View v= inflater.inflate(R.layout.fragment3, null);
           db = MainActivity.dbh.getWritableDatabase();
           str = new ArrayList<String>();
           Cursor c = db.query("mytable",null,null,null,null,null,null);
           if(c.moveToFirst()){
		    	int nameColIndex = c.getColumnIndex("login");
		    	int passColIndex = c.getColumnIndex("password");
		    	
		    	do {
		    		String name=c.getString(nameColIndex);
		    		String pass=c.getString(passColIndex);
		    		
		    		str.add(name);
		    		ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
		    	            android.R.layout.simple_list_item_1, str);
		    		lv.setAdapter(dataAdapter);
		    	}
		    	while(c.moveToNext());
		    }
        return v;
    }
}

finberg
Сообщения: 51
Зарегистрирован: 11 мар 2013, 14:20

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение finberg » 04 дек 2014, 22:31

Вам нужен SimpleCursorAdapter, и не надо будет перегонять в ArrayList.

zanoga
Сообщения: 1
Зарегистрирован: 10 дек 2014, 12:43

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение zanoga » 10 дек 2014, 13:03

Всем привет. Помогите пожалуйста.
Делаю приложение в котором 2 фрагмента - в 1 Listview со списком заголовков статей, второй отображает содержимое статей. Хочу сделать с помощью replace. Ссылку передаю в активити с помощью интерфейса someEvent(как на уроке). Потом из активити отдаю ее фрагменту2.

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

@Override
    public void someEvent(String s) {
        final Fragment frag2 = getFragmentManager().findFragmentById(R.id.fragment2);
        final WebView web = ((WebView) frag2.getView().findViewById(R.id.webView));
       web.loadURL(s);
}
тут все передаеться, и переходится на новый фрагмент, НО вместо того чтобы открыть WebView во Фрагменете она открывается в браузере!! Почему не могу понять
Вот код Fragment2.class

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

public class Fragment2 extends Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment2, null);
     
        return v;
    }
 }

Подскажите пожалуйста, в чем может быть проблема?!

chasovoy
Сообщения: 2
Зарегистрирован: 01 фев 2015, 14:30

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение chasovoy » 01 фев 2015, 15:08

Не могу разобраться в своей проблеме:
Во фрагментах у меня несколько кнопок, в активити текстовые поля.
Проблема в том что не могу поставить обработчик на несколько кнопок:

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

button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
В данный момент использую для каждой кнопки свой метод onClick, но это бесконечный код....
Кто может помочь?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Mikhail_dev » 01 фев 2015, 15:12

Помочь в чем? Я не увидел описания проблемы. Обработчик на несколько кнопок так и ставится, так что всё в порядке.

chasovoy
Сообщения: 2
Зарегистрирован: 01 фев 2015, 14:30

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение chasovoy » 01 фев 2015, 15:17

Mikhail_dev писал(а):Помочь в чем? Я не увидел описания проблемы. Обработчик на несколько кнопок так и ставится, так что всё в порядке.
Проблема в том что во фрагменте он не хочет работать, а если я его ставлю в активити то видимо он не видит кнопки во фрагментах

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение doter.ua » 01 фев 2015, 15:58

chasovoy писал(а):
Mikhail_dev писал(а):Помочь в чем? Я не увидел описания проблемы. Обработчик на несколько кнопок так и ставится, так что всё в порядке.
Проблема в том что во фрагменте он не хочет работать, а если я его ставлю в активити то видимо он не видит кнопки во фрагментах
((YourActivityClassName)getActivity()).yourPublicMethod(); попробуй так. Т.е. сет онклик во фрагменте, но вызывает он рукодельный паблик метод у активити.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Mikhail_dev » 01 фев 2015, 16:01

chasovoy писал(а):
Mikhail_dev писал(а):Помочь в чем? Я не увидел описания проблемы. Обработчик на несколько кнопок так и ставится, так что всё в порядке.
Проблема в том что во фрагменте он не хочет работать, а если я его ставлю в активити то видимо он не видит кнопки во фрагментах
Потому что у вас интерфейс OnClickListener определён для активности, а не для фрагмента. Сделайте его и для фрагмента
((YourActivityClassName)getActivity()).yourPublicMethod(); попробуй так. Т.е. сет онклик во фрагменте, но вызывает он рукодельный паблик метод у активити.
Изображение

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение doter.ua » 01 фев 2015, 16:07

Mikhail_dev писал(а):
chasovoy писал(а):
Mikhail_dev писал(а):Помочь в чем? Я не увидел описания проблемы. Обработчик на несколько кнопок так и ставится, так что всё в порядке.
Проблема в том что во фрагменте он не хочет работать, а если я его ставлю в активити то видимо он не видит кнопки во фрагментах
Потому что у вас интерфейс OnClickListener определён для активности, а не для фрагмента. Сделайте его и для фрагмента
((YourActivityClassName)getActivity()).yourPublicMethod(); попробуй так. Т.е. сет онклик во фрагменте, но вызывает он рукодельный паблик метод у активити.
Изображение
По хорошему такую картинку нужно на весь андроид налепить. Фрагменты сами по себе велосипед велосипедный. Чего только стоит куча АПИ версий совместимость которых поддерживается вермишелью из саппорт костылей. Так что для андроида это нормально.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Mikhail_dev » 01 фев 2015, 16:11

Нет, ненормально. Не надо мешать багнутый андроид и сильносвязанную архитектуру. Код должен писаться на интерфейсах и не должен зависеть друг с другом. Это относится к любому коду.
А что не так с фрагментами? Саппорт либа да, та еще морока.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение doter.ua » 01 фев 2015, 16:28

Mikhail_dev писал(а):Нет, ненормально. Не надо мешать багнутый андроид и сильносвязанную архитектуру. Код должен писаться на интерфейсах и не должен зависеть друг с другом. Это относится к любому коду.
А что не так с фрагментами? Саппорт либа да, та еще морока.
Изначально же не было планшетов, и только после их появления добавили фрагменты. Фрагмент просто надстройка над активити. По поводу имплементации это еще нужно как-то объяснить новичку.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Mikhail_dev » 01 фев 2015, 18:56

Если новичек не знает имплементации, то для таких я написал заметку, что первая в моей подписи.
Я бы не называл фрагмент как надстройка, потому что он легче чем активность и не требует записи в манифесте. Да и планшеты появились до версии 3.0, у меня даже был такой. Их было не совсем много, но они были.

Indigo
Сообщения: 3
Зарегистрирован: 11 июн 2015, 18:08

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение Indigo » 11 июн 2015, 18:15

Добрый день! Подскажите, могу ли я через метод getActivity передать id метода onItemClick ListFragmenta в Activity?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение KamiSempai » 11 июн 2015, 20:09

Можно использовать AdapterView.OnItemClickListener. Если активити реализует этот интерфейс, передавать нажатие через onItemClick.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

j-test
Сообщения: 11
Зарегистрирован: 29 окт 2015, 20:52

Re: Урок 106. Android 3. Fragments. Взаимодействие с Activit

Сообщение j-test » 19 ноя 2015, 23:03

Как реализовать этот урок после того как onAttach(Actitivity) стал Deprecated (достали разрабы...) ?

пробовал вот так-

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

public interface onMainMenuListener
    {
        public void onButtonClickEvent(int i);
    }

    onMainMenuListener mainMenuListener;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        try {

            Activity activity;
            if (context instanceof Activity){
                activity=(Activity) context;

            mainMenuListener = (onMainMenuListener) activity;

            }

        }
        catch (ClassCastException e)
        {
            throw new ClassCastException(context.toString()+" must implement onMainMenuListener");
        }
    }
в итоге на попытке передать значение приложение вылетает

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

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

        View v=inflater.inflate(R.layout.mainmenu_fragment,container,false);
        Button trainButton = (Button) v.findViewById(R.id.button_train);
        trainButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                [color=#BF0000]mainMenuListener.onButtonClickEvent(1);[/color]
            }
        });


        Button youtubeButton = (Button) v.findViewById(R.id.button_youtube);
        youtubeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                [color=#BF0000]mainMenuListener.onButtonClickEvent(2);[/color]
            }
        });


        return v;
    }
FATAL EXCEPTION: main

java.lang.NullPointerException
at company.ais.simplearithmetic.fragment.MainMenuFragment$1.onClick(MainMenuFragment.java:58)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)

Ответить