Страница 3 из 4

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

Добавлено: 01 дек 2014, 14:10
doter.ua
finberg писал(а):
Pedro Sancez писал(а): без участии активити
почему избегаешь активити?

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

Добавлено: 01 дек 2014, 21:47
Pedro Sancez
В общем не буду ходить вокруг-да около. Кроме как у Вас, мне спросить не у кого.(За это вам ОГРОМНЕЙШАЯ БЛАГОДАРНОСТЬ!) В общем мне нужно написать примитивную программу, управляющую локальной базой данных пользователей.
Регистрация/авторизация пользователей, чтение/изменение/сохранение личных данных, просмотр списка пользователей в базе.
Данные - логин/пароль, имя, контактные данные (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();
			}	
        });
        
    }

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

Добавлено: 01 дек 2014, 21:53
Foenix
работать с б.д. можно по-разному. Например, с помощью контент-провайдеров. По этой теме был вебинар. Посмотри для начала его. Я там освещала самые важные вопросы и по возможности коротко.

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

Добавлено: 02 дек 2014, 01:17
doter.ua
Как на счет Static подключения к бд в активити (желательно в том, которое живет дольше всех), которое будет использоваться во всех остальных уголках приложения?

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

...

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

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

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

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

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

Добавлено: 03 дек 2014, 23:40
Pedro Sancez
Помогите пожалуйста в следующем вопросе. Мне нужно вывести в листвью, которое находится во фрагменте, базу данных. Я в адаптерах не силён, естественно конструктор 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;
    }
}

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

Добавлено: 04 дек 2014, 22:31
finberg
Вам нужен SimpleCursorAdapter, и не надо будет перегонять в ArrayList.

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

Добавлено: 10 дек 2014, 13:03
zanoga
Всем привет. Помогите пожалуйста.
Делаю приложение в котором 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;
    }
 }

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

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

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

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

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

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

Добавлено: 01 фев 2015, 15:12
Mikhail_dev
Помочь в чем? Я не увидел описания проблемы. Обработчик на несколько кнопок так и ставится, так что всё в порядке.

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

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

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

Добавлено: 01 фев 2015, 15:58
doter.ua
chasovoy писал(а):
Mikhail_dev писал(а):Помочь в чем? Я не увидел описания проблемы. Обработчик на несколько кнопок так и ставится, так что всё в порядке.
Проблема в том что во фрагменте он не хочет работать, а если я его ставлю в активити то видимо он не видит кнопки во фрагментах
((YourActivityClassName)getActivity()).yourPublicMethod(); попробуй так. Т.е. сет онклик во фрагменте, но вызывает он рукодельный паблик метод у активити.

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 11 июн 2015, 20:09
KamiSempai
Можно использовать AdapterView.OnItemClickListener. Если активити реализует этот интерфейс, передавать нажатие через onItemClick.

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

Добавлено: 19 ноя 2015, 23:03
j-test
Как реализовать этот урок после того как 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)