W mojej klasie Fragment mam to:

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater.inflate(R.menu.my_menu, menu)
        val searchItem = menu.findItem(R.id.action_search)
        searchView = searchItem.actionView as SearchView
        searchView.apply{
            queryHint = "Search"
            isIconified = false
            setOnQueryTextListener(object : SearchView.OnQueryTextListener{
                override fun onQueryTextSubmit(query: String): Boolean {
                    // pass the query to the other fragment and navigate to it
                    findNavController().navigate(GroupListFragmentDirections.actionGroupListFragmentToSearchedGroupListFragment(query))
                    return false
                }

                override fun onQueryTextChange(newText: String): Boolean {
                    // start the search
                    //groupListViewModel.searchGroups(newText)
                    return false
                }
            })
        }
    }

Teraz chodzi o to, że chcę przekazać zapytanie do drugiego fragmentu i przejść do niego. Drugi fragment następnie przetwarza zapytanie w określony sposób. Ale Android Studio mówi mi, że SearchView nie ma zestawu NavController. Tutaj komunikat o błędzie, który znalazłem w LogCat:

java.lang.IllegalStateException: View androidx.appcompat.widget.SearchView{c83b4ef VFE...... ........ 147,10-987,136 #7f08003d app:id/action_search} does not have a NavController set
        at androidx.navigation.Navigation.findNavController(Navigation.java:84)
        at androidx.navigation.ViewKt.findNavController(View.kt:28)
        at com.celik.abdullah.mylim4.ui.GroupListFragment$onCreateOptionsMenu$1$1.onQueryTextSubmit(GroupListFragment.kt:93)
        at androidx.appcompat.widget.SearchView.onSubmitQuery(SearchView.java:1191)
        at androidx.appcompat.widget.SearchView$7.onEditorAction(SearchView.java:1168)
        at android.widget.TextView.onEditorAction(TextView.java:5911)
        at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:138)
        at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:360)
        at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85)
...

Używam biblioteki NavigationUI ze składników architektury systemu Android. Układ MainActivity zawiera widget układu NavHostFragment. Kod fragmentu, który widziałeś powyżej, jest fragmentem początkowym (fragmentem, który użytkownik widzi po otwarciu aplikacji).

Zakładam, że nie wolno używać funkcji findNavController () w odbiorniku dla widoku wyszukiwania. Niemniej jednak, czy istnieje słowo dookoła, aby przekazać zapytanie z widoku wyszukiwania do następnego fragmentu.

Oto mój układ aktywności:

// activity_main.xml
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

        <fragment
            android:id="@+id/myNavHostFragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/navigation" />

</LinearLayout>

A tutaj mój navigation.xml:

<navigation 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/navigation"
    app:startDestination="@id/groupListFragment">

    <fragment
        android:id="@+id/groupListFragment"
        android:name="com.celik.abdullah.mylim4.ui.GroupListFragment"
        android:label="GroupListFragment"
        tools:layout="@layout/fragment_group_list">
        <action
            android:id="@+id/action_groupListFragment_to_searchedGroupListFragment"
            app:destination="@id/searchedGroupListFragment" />
    </fragment>
    <fragment
        android:id="@+id/searchedGroupListFragment"
        android:name="com.celik.abdullah.mylim4.ui.SearchedGroupListFragment"
        android:label="SearchedGroupListFragment"
        tools:layout="@layout/fragment_searched_group_list">
        <argument
            android:name="query"
            app:argType="string" />
    </fragment>
</navigation>
0
aminakoy 19 grudzień 2019, 23:46
Czy możesz opublikować plik xml nawigacji i xml aktywności, który zawiera nawigację?
 – 
Christilyn Arjona
19 grudzień 2019, 23:48
@Christilyn: dodałem je.
 – 
aminakoy
19 grudzień 2019, 23:57

1 odpowiedź

Jeśli używasz SearchView w swoim Toolbar, powinieneś skonfigurować Toolbar z nawigacją:

override fun onCreate(savedInstanceState: Bundle?) {
    setContentView(R.layout.activity_main)

    ...

    val navController = findNavController(R.id.nav_host_fragment)
    val appBarConfiguration = AppBarConfiguration(navController.graph)
    findViewById<Toolbar>(R.id.toolbar)
        .setupWithNavController(navController, appBarConfiguration)
}

Podobnie dla ActionBar:

setupActionBarWithNavController(navController, appBarConfiguration)

Zobacz ten link, aby uzyskać więcej informacji: https://developer.android.com/guide /navigation/navigation-ui#appbarconfiguration

0
Christilyn Arjona 20 grudzień 2019, 01:00