Move search view to app bar

Julien LepillerSat Jul 31 03:42:48+0200 2021

105d4f4

Move search view to app bar

CHANGELOG.md

2727
### UI
2828
2929
* Added support for dark theme.
30+
* Moved search bar to the app bar, leaving more space for results.
3031
3132
Changes in 0.3.2.1
3233
------------------

app/src/main/java/eu/lepiller/nani/MainActivity.java

1818
import android.view.MenuItem;
1919
import android.widget.Button;
2020
import android.widget.LinearLayout;
21-
import android.widget.SearchView;
21+
import androidx.appcompat.widget.SearchView;
2222
import android.widget.TextView;
2323
2424
import com.google.android.material.tabs.TabLayout;

5959
6060
        result_layout = findViewById(R.id.result_layout);
6161
        feedback_text = findViewById(R.id.feedback);
62-
        search_form = findViewById(R.id.search_form);
6362
        radical_selector = findViewById(R.id.radical_selector);
6463
        TabLayout tabLayout = findViewById(R.id.tab_layout);
6564
        viewPager2 = findViewById(R.id.pager);

9897
            e.printStackTrace();
9998
        }
10099
101-
        search_form.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
102-
            @Override
103-
            public boolean onQueryTextSubmit(String query) {
104-
                radical_selector.setVisibility(View.INVISIBLE);
105-
                result_layout.setVisibility(View.VISIBLE);
106-
107-
                String text = search_form.getQuery().toString();
108-
                if (text.isEmpty()) {
109-
                    Snackbar.make(findViewById(R.id.search_form), getString(R.string.no_search), Snackbar.LENGTH_LONG).show();
110-
                    return false;
111-
                }
112-
113-
                pagerAdapter.setKanjiResults(new ArrayList<KanjiResult>());
114-
                pagerAdapter.setResults(new ArrayList<Result>());
115-
                pagerAdapter.notifyDataSetChanged();
116-
117-
                search_form.setEnabled(false);
118-
                feedback_text.setText(R.string.feedback_progress);
119-
120-
                DictionaryFactory.prepare(getApplicationContext());
121-
                new SearchTask(MainActivity.this).execute(text);
122-
                return true;
123-
            }
124-
125-
            @Override
126-
            public boolean onQueryTextChange(String newText) {
127-
                return false;
128-
            }
129-
        });
130-
131100
        radical_button.setOnClickListener(new View.OnClickListener() {
132101
            @Override
133102
            public void onClick(View v) {

135104
                    DictionaryFactory.getRadicalDictionary(getApplicationContext());
136105
                    radical_selector.setVisibility(View.VISIBLE);
137106
                    result_layout.setVisibility(View.INVISIBLE);
107+
                    search_form.setIconified(false);
138108
                } catch (NoDictionaryException e) {
139-
                    Snackbar.make(findViewById(R.id.search_form), getString(R.string.no_radical_dict), Snackbar.LENGTH_LONG).show();
109+
                    Snackbar.make(search_form, getString(R.string.no_radical_dict), Snackbar.LENGTH_LONG).show();
140110
                }
141111
            }
142112
        });

144114
        radical_selector.setOnCloseEventListener(new View.OnClickListener() {
145115
            @Override
146116
            public void onClick(View v) {
147-
                radical_selector.setVisibility(View.INVISIBLE);
148-
                result_layout.setVisibility(View.VISIBLE);
117+
                closeRadicals();
149118
            }
150119
        });
151120

166135
        });
167136
    }
168137
138+
    private void closeRadicals() {
139+
        radical_selector.setVisibility(View.INVISIBLE);
140+
        result_layout.setVisibility(View.VISIBLE);
141+
    }
142+
169143
    @Override
170144
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
171145
        Log.d("MAIN", key + " preference changed.");

279253
        if(r.isException()) {
280254
            DictionaryException e = r.getException();
281255
            if (e instanceof NoDictionaryException) {
282-
                Snackbar.make(findViewById(R.id.search_form), getString(R.string.no_dic),
256+
                Snackbar.make(search_form, getString(R.string.no_dic),
283257
                        Snackbar.LENGTH_LONG).show();
284258
                feedback_text.setText(getString(R.string.no_dic));
285259
            } else if(e instanceof IncompatibleFormatException) {
286-
                Snackbar.make(findViewById(R.id.search_form), String.format(getString(R.string.incompatible_format),
260+
                Snackbar.make(search_form, String.format(getString(R.string.incompatible_format),
287261
                        ((IncompatibleFormatException) e).getName()), Snackbar.LENGTH_LONG).show();
288262
                feedback_text.setText(String.format(getString(R.string.incompatible_format),
289263
                        ((IncompatibleFormatException) e).getName()));

340314
    public boolean onCreateOptionsMenu(Menu menu) {
341315
        // Inflate the menu; this adds items to the action bar if it is present.
342316
        getMenuInflater().inflate(R.menu.menu_main, menu);
343-
        return true;
317+
318+
        MenuItem searchItem = menu.findItem(R.id.action_search);
319+
        search_form = (SearchView) searchItem.getActionView();
320+
321+
        search_form.setQueryHint(getResources().getString(R.string.search_hint));
322+
323+
        search_form.setOnCloseListener(new SearchView.OnCloseListener() {
324+
            @Override
325+
            public boolean onClose() {
326+
                closeRadicals();
327+
                return false;
328+
            }
329+
        });
330+
331+
        search_form.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
332+
            @Override
333+
            public boolean onQueryTextSubmit(String query) {
334+
                radical_selector.setVisibility(View.INVISIBLE);
335+
                result_layout.setVisibility(View.VISIBLE);
336+
337+
                String text = search_form.getQuery().toString();
338+
                if (text.isEmpty()) {
339+
                    Snackbar.make(search_form, getString(R.string.no_search), Snackbar.LENGTH_LONG).show();
340+
                    return false;
341+
                }
342+
343+
                pagerAdapter.setKanjiResults(new ArrayList<KanjiResult>());
344+
                pagerAdapter.setResults(new ArrayList<Result>());
345+
                pagerAdapter.notifyDataSetChanged();
346+
347+
                search_form.setEnabled(false);
348+
                feedback_text.setText(R.string.feedback_progress);
349+
350+
                DictionaryFactory.prepare(getApplicationContext());
351+
                new SearchTask(MainActivity.this).execute(text);
352+
                return true;
353+
            }
354+
355+
            @Override
356+
            public boolean onQueryTextChange(String newText) {
357+
                return false;
358+
            }
359+
        });
360+
361+
        return super.onCreateOptionsMenu(menu);
344362
    }
345363
346364
    @Override

app/src/main/res/layout/content_main.xml

99
    tools:context=".MainActivity"
1010
    tools:showIn="@layout/activity_main">
1111
12-
    <SearchView
13-
        android:id="@+id/search_form"
14-
        android:layout_width="match_parent"
15-
        android:layout_height="wrap_content"
16-
        android:layout_marginStart="16dp"
17-
        android:layout_marginLeft="16dp"
18-
        android:layout_marginEnd="16dp"
19-
        android:layout_marginRight="16dp"
20-
        android:layout_marginTop="32dp"
21-
        android:ems="10"
22-
        android:hint="@string/search_hint"
23-
        android:importantForAutofill="no"
24-
        android:inputType="text"
25-
        android:iconifiedByDefault="false" />
26-
2712
    <FrameLayout
2813
        android:layout_width="match_parent"
2914
        android:layout_height="match_parent">

app/src/main/res/menu/menu_main.xml

33
    xmlns:tools="http://schemas.android.com/tools"
44
    tools:context="eu.lepiller.nani.MainActivity">
55
    <item
6+
        android:id="@+id/action_search"
7+
        android:title="@string/action_search"
8+
        android:icon="@android:drawable/ic_menu_search"
9+
        app:showAsAction="ifRoom"
10+
        app:actionViewClass="androidx.appcompat.widget.SearchView" />
11+
    <item
612
        android:id="@+id/action_dictionaries"
713
        android:title="@string/action_dictionaries" />
814
    <item

app/src/main/res/values/strings.xml

11
<resources>
22
    <string name="app_name" translatable="false">Nani?</string>
3+
    <string name="action_search">Search</string>
34
    <string name="action_settings">Settings</string>
45
    <string name="action_dictionaries">Manage Dictionaries</string>
56
    <string name="action_help">Help</string>