android toolbar통신

이미지

코드상의 문제는 아니고 툴바에 검색버튼에 대해 질문할 것이 있습니다. 일단 저의 메인 xml코드입니다.

<android.support.design.widget.AppBarLayout
    android:id="@+id/mainActivity_appBarLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.Toolbar
            android:id="@+id/mainActivity_toolBar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorPrimary"
            android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:titleTextColor="@color/white">

        </android.support.v7.widget.Toolbar>

        <com.miguelcatalan.materialsearchview.MaterialSearchView
            android:id="@+id/toolBar_searchView"
            style="@style/MaterialSearchViewStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </FrameLayout>

</android.support.design.widget.AppBarLayout>

<com.app.jiwon.tekken7_manual.Custom.CustomViewPager
    android:id="@+id/mainActivity_viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/mainActivity_coordinatorLayout"
    android:layout_below="@+id/mainActivity_appBarLayout" />

<View
    android:id="@+id/mainActivity_navShdow"
    android:layout_width="match_parent"
    android:layout_height="@dimen/item_select_recyclerView_cardView_shadow"
    android:layout_above="@+id/mainActivity_coordinatorLayout"
    android:background="@drawable/bottom_nav_shadow" />

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/mainActivity_coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true">

    <com.aurelhubert.ahbottomnavigation.AHBottomNavigation
        android:id="@+id/mainActivity_tabLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:selectedBackgroundVisible="false">

    </com.aurelhubert.ahbottomnavigation.AHBottomNavigation>

</android.support.design.widget.CoordinatorLayout>

코드로 보면 알 수 있듯이 메인에 툴바가 존재하고 viewpager 안에 4개의 프레그먼트로 이루어진 화면입니다. 여기서 검색버튼을 구현하려고할 때 filter함수를 브로드캐스트로 알리면서 하기엔 성능이 심각하게 저하될 것같아서 메인 툴바의 메뉴와 프레그먼트의 리사이클러뷰와 통신할 다른 좋은 방법이 있는지 궁금합니다!

  • filter 함수의 내용과 대략적인 동작 흐름을 덧붙여 설명해주실수 있나요? pistolcaffe 2018.7.5 11:33
  • 툴바의 검색버튼이 리스트뷰에있는 캐릭터들을 찾는 버튼입니다. 캐릭터 이름을 입력하면 리스트뷰가 재갱신되며 검색이 되야하는데 툴바는 보시는데로 메인에 존재하고 리스트뷰는 뷰페이져 < 프레그먼트 < 리스트뷰에 존재해서 어떻게 통신을 해야되는지에 대한 질문입니다. 정지원 2018.7.5 12:15

1답변

  • 좋아요

    1

    싫어요
    채택취소하기

    여러 방법이 존재 할 수 있습니다. SearchView 의 Submit Callback 이 발생 했을때 기준으로 한가지 예시를 들어보겠습니다.

    Fragment 에 callback 에 대한 핸들링을 위한 메소드를 작성 후 이를 호출 하는 방식

    public class MainActivity extends AppCompatActivity {
    
        private MaterialSearchView searchView;
        private ViewPager pager;
        private TestAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            searchView = findViewById(R.id.search_view);
            pager = findViewById(R.id.viewPager);
    
            adapter = new TestAdapter(getSupportFragmentManager());
            pager.setAdapter(adapter);
    
            searchView.setOnQueryTextListener(new MaterialSearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    ((TestFragment) adapter.getItem(pager.getCurrentItem())).handleSubmittedQuery(query);
                    return false;
                }
    
                @Override
                public boolean onQueryTextChange(String newText) {
                    return false;
                }
            });
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu, menu);
            MenuItem item = menu.findItem(R.id.action_search);
            searchView.setMenuItem(item);
            return true;
        }
    
        static class TestAdapter extends FragmentStatePagerAdapter {
    
            private List<TestFragment> fragmentList = new ArrayList<>();
    
            public TestAdapter(FragmentManager fm) {
                super(fm);
                for (int i = 0; i < 5; i++) {
                    fragmentList.add(new TestFragment());
                }
            }
    
            @Override
            public Fragment getItem(int position) {
                return fragmentList.get(position);
            }
    
            @Override
            public int getCount() {
                return fragmentList.size();
            }
        }
    
        public static class TestFragment extends Fragment {
    
            @Nullable
            @Override
            public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
                return inflater.inflate(R.layout.fragment, container, false);
            }
    
            public void handleSubmittedQuery(String query) {
                //do something (리스트 갱신 etc..)
            }
        }
    }
    

    각 Fragment 에서 getActivity().findViewById(R.id.search_view) 로 Activity 의 SearchView 의 참조를 얻어서 직접 핸들링 하는 방법도 생각해볼수도 있겠지만 개인적으론 위 방법이 더 좋을것 같습니다.

    • ((TestFragment) adapter.getItem(pager.getCurrentItem())).handleSubmittedQuery(query); 이코드에서 직접 프레그먼트까지 통신을 하는거군요. 브로드캐스트로 떄리는것보단 훨씬 좋아보이네요 좋은 답변 감사합니다. 정지원 2018.7.5 14:22
    • 네 맞습니다 :) pistolcaffe 2018.7.5 17:08

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.