android toolbar통신
조회수 704회
코드상의 문제는 아니고 툴바에 검색버튼에 대해 질문할 것이 있습니다. 일단 저의 메인 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함수를 브로드캐스트로 알리면서 하기엔 성능이 심각하게 저하될 것같아서 메인 툴바의 메뉴와 프레그먼트의 리사이클러뷰와 통신할 다른 좋은 방법이 있는지 궁금합니다!
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
- 네 맞습니다 :) 알 수 없는 사용자 2018.7.5 17:08
-
댓글 입력