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

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

Войти
Регистрация
Восстановить пароль
 
 
rusik1994
25 / 25 / 5
Регистрация: 16.07.2012
Сообщений: 304
Записей в блоге: 1
#1

Searchview в toolbar - Программирование Android

06.04.2016, 16:03. Просмотров 1464. Ответов 19

Доброго времени суток уважаемые форумчане.
Нужна Ваша помощь в реализации поиска.
Есть несколько фрагментов, и searchview в toolbar-е как осуществить поиск для каждого фрагмента через этот searchview. как к нему обращаться и как нужно настроить.

вот сам код и при таком обращении программа рушиться и закрывается выдав ошибку приложения

Java
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
package com.example.rustam.proektmenu.main_fragment;
 
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SearchView;
 
import com.example.rustam.proektmenu.R;
 
public class fragment_slovar extends Fragment {
String[]    spisok;
EditText inputserch;
SearchView sv;
private ListView lv;
ArrayAdapter<String> adapter;
 
@Nullable
@Override
 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootview= inflater.inflate(R.layout.fragment_slovar,container,false);
spisok=getResources().getStringArray(R.array.country_name);
lv=(ListView) rootview.findViewById(R.id.listView);
sv=(SearchView)rootview.findViewById(R.id.search555);
adapter=new ArrayAdapter<String>(getActivity(),R.layout.stilspiskaslovarya,spisok);
lv.setAdapter(adapter);
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
 
public boolean onQueryTextSubmit(String text) {
return false;
}
 
 @Override
 
public boolean onQueryTextChange(String text) {
adapter.getFilter().filter(text);
return false;
}
});
return rootview;
}
}
Добавлено через 1 час 21 минуту
эххх никто не хочет помогать((
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2016, 16:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Searchview в toolbar (Программирование Android):

Скрыть тулбар у 1 фрагмента Tabbed Activity + toolbar + Searchview - Программирование Android
есть Tabbed Activity У неё тулбар в нем SearchView/ в Tabbed Activity 2 фрагмента. в 1 поиск не нужен во втором нужен. как сделать...

Как добавить динамически в ToolBar виджет SearchView в нужных фрагментах - Программирование Android
У меня есть Toolbar в MainActivity и нужно получить доступ к этому ToolBar во фрагменте MainActivity и добавить туда SearchView. Как такое...

SearchView в ActionBar - Программирование Android
Всем привет! Добавил в ActionBar фрагмента SearchView, но он не появляется, пустой ActionBar. С добавлением SearchView в ActionBar активити...

SearchView ругается на Listener? - Программирование Android
Добрый день! подскажите что ему не нравится: @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate...

Поиск в ListView с помощью SearchView - Программирование Android
Прикручиваю SearchView, чтобы фильтровать ListView: MenuItem ourSearchItem = menu.findItem(R.id.menu_item_search); ...

Отследить закрытие SearchView Android - Программирование Android
Подскажите пожалуйста, как отследить закрытие SearchView, производится нажатием на стрелку.Но отследить это нажатие не получается,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
06.04.2016, 16:23 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
rusik1994, привет!
Ну, для начала надо бы привести код в порядок.
В принципе, каждый решает эту задачу самостоятельно, примеров масса на разные случаи жизни. Подводных камней - тоже. Писать простыню кода лень.
1
rusik1994
25 / 25 / 5
Регистрация: 16.07.2012
Сообщений: 304
Записей в блоге: 1
06.04.2016, 16:41  [ТС] #3
CoolMind, ну если я использую компонент Search в самом фрагменте то поиск работает, а как сделать так чтобы android.support.v7.widget.SearchView в толбаре использовать для поиска в разных fragmentax. как нужно настроить и что нужно прописывать в манефесте если не составит труда объясните новичку

Добавлено через 2 минуты
CoolMind,
делал поиск с помощью Edit все прекрасно работало а вот с этим виджетом никак не получается подружиться

Добавлено через 11 минут
CoolMind, А что в коде не так то)))?
0
Pablito
2494 / 1939 / 605
Регистрация: 12.05.2014
Сообщений: 6,798
Завершенные тесты: 1
06.04.2016, 17:28 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
import android.app.Fragment;
заменить на
import android.support.v4.app.Fragment;

и ошибку надо скопировать из лога и сюда всю выложить
1
rusik1994
25 / 25 / 5
Регистрация: 16.07.2012
Сообщений: 304
Записей в блоге: 1
06.04.2016, 17:37  [ТС] #5
Паблито, щас попробую

Добавлено через 3 минуты
Паблито, если я заменяю как вы написали то ругается в главном активити
Java
1
2
3
4
5
Error:(114, 51) error: no suitable method found for replace(int,fragment_slovar)
method FragmentTransaction.replace(int,Fragment,String) is not applicable
(actual and formal argument lists differ in length)
method FragmentTransaction.replace(int,Fragment) is not applicable
(actual argument fragment_slovar cannot be converted to Fragment by method invocation conversion)
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
06.04.2016, 17:41 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от rusik1994 Посмотреть сообщение
SearchView в толбаре использовать для поиска в разных fragmentax
Насколько я помню, события набора текста в toolbar'е делаются в активности, там срабатывает слушатель (listener), который вызывает поиск (фильтрацию) в активном фрагменте. Т.е. вам нужно уметь передавать данные из активности в текущий фрагмент. Обычно это делается через listener'ы, но можно и некоторыми другими способами.

Добавлено через 2 минуты
Цитата Сообщение от rusik1994 Посмотреть сообщение
то ругается в главном активити
Если используете Fragment совместно с support-библиотекой, надо привести к "одному знаменателю" все связанные библиотеки и методы в разных классах. Например, FragmentManager тоже будет support-v4.
1
rusik1994
25 / 25 / 5
Регистрация: 16.07.2012
Сообщений: 304
Записей в блоге: 1
06.04.2016, 17:51  [ТС] #7
изменил все как вы написали теперь когда вызываю из меню переход на фрагмент где хочу сделать поиск то выводит следующее

Java
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
04-06 17:50:07.396 1857-1953/com.example.rustam.proektmenu I/OpenGLRenderer: Initialized EGL, version 1.4
04-06 17:50:07.466 1857-1953/com.example.rustam.proektmenu D/OpenGLRenderer: Enabling debug mode 0
04-06 17:50:07.936 1857-1857/com.example.rustam.proektmenu I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@d9e30e3 time:3282865
04-06 17:50:08.636 1857-1857/com.example.rustam.proektmenu D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
04-06 17:50:10.306 1857-1857/com.example.rustam.proektmenu D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
04-06 17:50:10.496 1857-1857/com.example.rustam.proektmenu D/AndroidRuntime: Shutting down VM
04-06 17:50:10.496 1857-1857/com.example.rustam.proektmenu E/AndroidRuntime: FATAL EXCEPTION: main
                                                                             Process: com.example.rustam.proektmenu, PID: 1857
                                                                             java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.SearchView.setOnQueryTextListener(android.widget.SearchView$OnQueryTextListener)' on a null object reference
                                                                                 at com.example.rustam.proektmenu.main_fragment.fragment_slovar.onCreateView(fragment_slovar.java:45)
                                                                                 at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
                                                                                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
                                                                                 at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
                                                                                 at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
                                                                                 at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
                                                                                 at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
                                                                                 at android.os.Handler.handleCallback(Handler.java:739)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                 at android.os.Looper.loop(Looper.java:135)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:5536)
                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                 at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1397)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1192)
04-06 17:50:13.396 1857-1857/com.example.rustam.proektmenu I/Process: Sending signal. PID: 1857 SIG: 9
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
06.04.2016, 17:54 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
rusik1994, в строке fragment_slovar.java:45 происходит вызов метода ну пустом объекте.
1
rusik1994
25 / 25 / 5
Регистрация: 16.07.2012
Сообщений: 304
Записей в блоге: 1
07.04.2016, 10:34  [ТС] #9
вот код фрагмента

Java
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
package com.example.rustam.proektmenu.main_fragment;
 
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toolbar;
 
import com.example.rustam.proektmenu.R;
 
public class fragment_slovar extends Fragment {
    String[]    spisok;
EditText inputserch;
    SearchView sv;
    private ListView lv;
    ArrayAdapter<String> adapter;
 
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        setHasOptionsMenu(true);
         View rootview= inflater.inflate(R.layout.fragment_slovar,container,false);
        spisok=getResources().getStringArray(R.array.country_name);
        lv=(ListView) rootview.findViewById(R.id.listView);
        sv=(SearchView)rootview.findViewById(R.id.search555);
        adapter=new ArrayAdapter<String>(getActivity(),R.layout.stilspiskaslovarya,spisok);
        lv.setAdapter(adapter);
 
        sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String text) {
                return false;
            }
 
            @Override
            public boolean onQueryTextChange(String text) {
                adapter.getFilter().filter(text);
 
                return false;
            }
        });
 
        return rootview;
    }
}
Добавлено через 5 минут
CoolMind,

ругается на вызов функции
Java
1
2
    
    sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
Добавлено через 3 минуты
хотя если вместо searchview из тоолбара вызываю searchview который на самом фрагменте никаких ошибок нет и программа корректно работает и производит фильтрацию

Добавлено через 34 секунды
может в манифесте что то нужно прописать?

Добавлено через 4 минуты
это что получается что фильтрация вызывается сразу при попытке вызвать данный фрагмент?

Добавлено через 16 часов 25 минут
CoolMind, а как установить слушателя (Listener) для searchView в фрагменте?
а то как только не перепробовал никак не хочет

пробовал запускать фильтрацию после получения фокуса SearchView тоже безрезультатно(((
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
07.04.2016, 18:56 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
rusik1994, ну как, получилось?
Вы фильтрацию внутри адаптера прописали?
1
rusik1994
25 / 25 / 5
Регистрация: 16.07.2012
Сообщений: 304
Записей в блоге: 1
07.04.2016, 19:22  [ТС] #11
CoolMind, нет не получилось(((

наверху отправил весь код фрагмента может подскажете где ошибки у меня там

Добавлено через 7 минут
CoolMind,
вот весь код фрагмента
Java
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
package com.example.rustam.proektmenu.main_fragment;
 
import android.app.SearchManager;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import com.example.rustam.proektmenu.R;
 
public class fragment_slovar extends Fragment {
 
    String[]    spisok;
    SearchView sv;
    private ListView lv;
    ArrayAdapter<String> adapter;
 
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        View rootview= inflater.inflate(R.layout.fragment_slovar,container,false);
        spisok=getResources().getStringArray(R.array.country_name);
        lv=(ListView) rootview.findViewById(R.id.listView);
        adapter=new ArrayAdapter<String>(getActivity(),R.layout.stilspiskaslovarya,spisok);
        lv.setAdapter(adapter);
        sv=(SearchView)rootview.findViewById(R.id.search555);
 
        sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
 
            @Override
            public boolean onQueryTextChange(String newText) {
                adapter.getFilter().filter(newText);
                return true;
            }
        });
 
        return rootview;
    }
}
Добавлено через 48 секунд
вот лог при попытке перейти на фрагмент где нужно произвести поиск



вот лог

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
04-07 19:13:30.662 11901-11901/? E/Zygote: v2
04-07 19:13:30.672 11901-11901/? E/SELinux: [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL
04-07 19:13:37.072 11901-12017/com.example.rustam.proektmenu E/OpenGLRenderer: SFEffectCache:clear(), mSize = 0
04-07 19:13:44.732 11901-11901/com.example.rustam.proektmenu E/AndroidRuntime: FATAL EXCEPTION: main
                                                                               Process: com.example.rustam.proektmenu, PID: 11901
                                                                               java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.SearchView.setOnQueryTextListener(android.widget.SearchView$OnQueryTextListener)' on a null object reference
                                                                                   at com.example.rustam.proektmenu.main_fragment.fragment_slovar.onCreateView(fragment_slovar.java:51)
                                                                                   at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
                                                                                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
                                                                                   at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
                                                                                   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
                                                                                   at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
                                                                                   at android.os.Handler.handleCallback(Handler.java:739)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                   at android.os.Looper.loop(Looper.java:135)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5536)
                                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                                   at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1397)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1192)
Добавлено через 1 минуту
и вот сама разметка

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">
 
    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_gravity="center_horizontal|bottom"
        android:textAlignment="gravity"
        android:divider="#d47501"
        android:dividerHeight="3dp"
        />
 
    
</FrameLayout>
Добавлено через 4 минуты
и вот сам файл меню откуда собственно и хочу произвести фильтрацию

Java
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
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never" />
 
    <item
        android:id="@+id/ngl"
        android:title="Главная"
        android:orderInCategory="1"
        app:showAsAction="never"
        />
    <item
        android:id="@+id/search555"
        android:title="Поиск"
        android:orderInCategory="2"
        app:actionViewClass="android.widget.SearchView"
        app:showAsAction="ifRoom"
        android:iconifiedByDefault="false"
 
        />
 
</menu>
0
Pablito
2494 / 1939 / 605
Регистрация: 12.05.2014
Сообщений: 6,798
Завершенные тесты: 1
08.04.2016, 14:47 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Java
1
sv=(SearchView)rootview.findViewById(R.id.search555);
так не ищется, это searchview считается пунктом меню, поэтому его надо искать в меню
пример как работать с ним, не совсем точный, но кто захочет - почитает и сделает выводы
Поиск в ListView с помощью SearchView
1
rusik1994
25 / 25 / 5
Регистрация: 16.07.2012
Сообщений: 304
Записей в блоге: 1
08.04.2016, 19:14  [ТС] #13
Паблито, уважаемый,Вы мне лучше подскажите как в фрагменте получить доступ к этому элементу. как установить для него слушатель. мне что нужно и в фрагменте вызывать onCreateOptionsMenu и уже там все это описывать?

Добавлено через 4 минуты
Паблито, сам фрагмент у меня наследуется так public class fragment_slovar extends Fragment
и все действия и прописываю внутри public View onCreateView вот таким образом

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        View rootview= inflater.inflate(R.layout.fragment_slovar,container,false);
        spisok=getResources().getStringArray(R.array.country_name);
        lv=(ListView) rootview.findViewById(R.id.listView);
        adapter=new ArrayAdapter<String>(getActivity(),R.layout.stilspiskaslovarya,spisok);
        lv.setAdapter(adapter);
        sv=(SearchView)rootview.findViewById(R.id.search555);
 
        sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
 
            @Override
            public boolean onQueryTextChange(String newText) {
                adapter.getFilter().filter(newText);
                return true;
            }
        });
 
        return rootview;
    }
Добавлено через 7 минут
Паблито, если я прописываю таким образом
Java
1
2
MenuItem ourSearchItem = menu.findItem(R.id.menu_item_search);
        SearchView searchView = (SearchView) ourSearchItem.getActionView();
то menu высвечивается красным. опять же прописываю все это внутри
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
0
Pablito
2494 / 1939 / 605
Регистрация: 12.05.2014
Сообщений: 6,798
Завершенные тесты: 1
08.04.2016, 19:20 #14
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
у фрагмента свое меню инфлейтится или этот item_search в меню активити?
1
rusik1994
25 / 25 / 5
Регистрация: 16.07.2012
Сообщений: 304
Записей в блоге: 1
08.04.2016, 19:23  [ТС] #15
Паблито, это из активити все идет. внутри фрагмента только адаптер для вывода списка к нему и хочу прописать фильтрацию через этот searchview
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2016, 19:23
Привет! Вот еще темы с ответами:

Спрятать SearchView в некоторых фрагментах - Программирование Android
Всем привет, такой вопрос: Есть NavigationDrawer В одном фрагменте реализован viewPager , там 2 фрагмента и в каждом searchView в...

Передать SearchView из активити во фрагмент - Программирование Android
У меня есть SearchView в активити и тесть фрагмент который запускается через транзакцию. И как мне правильно передать SearchView из...

SearchView или своя реализация поиска (UI) - Программирование Android
Требуется реализовать интерфейс для поиска. В ActionBar имеется SearchView, который отправляет запрос на сервер, после этого приходит...

SearchView как выводить текст ничего не найдено - Программирование Android
Есть поиск по RV/ в поиске не силен сделал по туториалу какому то, но теперь возник вопрос как выводить текст или toast если ничего...


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

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

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