본문 바로가기

Development/JAVA 앱 개발노트

(My Voca) Day 14. 현재 문제 상황

SearchView를 사용하려고 했는데 다음과 같은 문제가 발생했다.

 

1. FloatingActionButton을 누르면 배경인 원이 넓어지면서 내부에 EditText가 떠야하는데 도형 뒤에 실현됨

2. FAB를 누르면 바로 ET가 떠야하는데 안뜨고 다른 버튼을 눌러야만 ET가 뜸

 

이 두 가지를 해결하고 나면 RecyclerView 또는 Crawling 기능을 구현해야함

 

- MainActivity

 

package com.example.myvocaproject;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.CheckBox;
import androidx.appcompat.widget.SearchView;

import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.TimeZone;

public class MainActivity extends AppCompatActivity {



    // 현재 시간을 한국 시간으로 변환
    private TimeZone tz = TimeZone.getTimeZone("Asia/Seoul");
    private Calendar cal = Calendar.getInstance(tz);

    private CheckBox cb1, cb2, cb3;
    private BottomNavigationView bottomNavigationView;
    private FragmentManager fm;
    private FragmentTransaction ft;
    private Frag1 frag1;
    private Frag2 frag2;
    private Frag3 frag3;
    private SearchButton searchButton;
    private SearchView searchView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        cb1 = findViewById(R.id.cb_task1);
        cb2 = findViewById(R.id.cb_task2);
        cb3 = findViewById(R.id.cb_task3);


        // 새벽 5시를 설정 //
        Calendar morning5 = Calendar.getInstance(tz);
        morning5.set(Calendar.HOUR_OF_DAY, 5);
        morning5.set(Calendar.MINUTE, 0);
        morning5.set(Calendar.SECOND, 0);
        morning5.set(Calendar.MILLISECOND, 0);


        cb1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 이벤트 처리코드 //
                cb1.setChecked(true);

                // 새벽 5시 이후에 자동 체크 해제
                if(cal.after(morning5)) {
                    cb1.setChecked(false);
                }
            }
        });

        cb2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 이벤트 처리코드//
                cb2.setChecked(true);

                // 새벽 5시 이후에 자동 체크 해제
                if(cal.after(morning5)) {
                    cb2.setChecked(false);
                }
            }
        });

        cb3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 이벤트 처리코드//
                cb3.setChecked(true);

                // 새벽 5시 이후에 자동 체크 해제
                if(cal.after(morning5)) {
                    cb3.setChecked(false);
                }
            }
        });

        // 추천 암기 단어
        // 추천 암기 단어 리사이클러뷰 확인 필요

        // 뷰페이저2 추가(추천단어, 시험문제(시험문제는 시험 문제 내는 코드를 따로 짜야 다음 단계로 갈 수 있음)



        // searchview에 텍스트 지우기 버튼 기능 추가하여 구현
        searchView = findViewById(R.id.search_view);

        int searchCloseButtonId = searchView.getContext().getResources()
                .getIdentifier("android:id/search_close_btn", null, null);
        Drawable closeIcon = ContextCompat.getDrawable(MainActivity.this, R.drawable.baseline_clear_24); // 텍스트 지우기 버튼 아이콘

        searchView.findViewById(R.id.search_close_btn).setBackground(closeIcon);
        searchView.setOnCloseListener(new SearchView.OnCloseListener() {
            @Override
            public boolean onClose() {
                searchView.setQuery("", false); // 텍스트 지우기
                return false;
            }
        });

        searchButton = new SearchButton(MainActivity.this.findViewById(android.R.id.content));

// SearchButton 인스턴스를 SearchView에 설정
        searchView.setOnSearchClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // SearchButton 인스턴스를 사용하여 동작 수행
                searchButton.openSearch();
            }
        });

// SearchButton 인스턴스를 SearchView에 설정
        searchView.setOnCloseListener(new SearchView.OnCloseListener() {
            @Override
            public boolean onClose() {
                // SearchButton 인스턴스를 사용하여 동작 수행
                searchButton.closeSearch();
                return false;
            }
        });






        List<TestContainer> testContainers = new ArrayList<>();
        testContainers.add(new TestContainer("O X TEST", "단어와 뜻이 잘 매칭됐는지 \n" + "맞춰보세요."));
        testContainers.add(new TestContainer("MULTIPLE CHOICE TEST", "단어에 맞는 뜻 \n" + "(또는 그 반대)를 찾아보세요."));
        testContainers.add(new TestContainer("BLANC TEST", "빈 칸에 들어갈 \n" + "알맞은 말을 찾아보세요."));

        TestAdapter adapter = new TestAdapter(this, testContainers);

        bottomNavigationView = findViewById(R.id.bottomNavi);
        bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.action_home:
                        setFrag(0);
                        break;
                    case R.id.action_note:
                        setFrag(1);
                        break;
                    case R.id.action_test:
                        setFrag(2);
                        break;
                    case R.id.action_setting:
                        setFrag(3);
                        break;
                }
                return true;
            }
        });

        frag1 = new Frag1();
        frag2 = new Frag2();
        frag3 = new Frag3();
    }
    private void setFrag(int n) {
        fm = getSupportFragmentManager();
        ft = fm.beginTransaction();
        switch (n) {
            case 0 :
                ft.replace(R.id.main_frame, frag1);
                ft.commit();
                break;
            case 1 :
                ft.replace(R.id.main_frame, frag2);
                ft.commit();
                break;
            case 2 :
                ft.replace(R.id.main_frame, frag3);
                ft.commit();
                break;
        }
    }
}

 

- SearchButton

package com.example.myvocaproject;

import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import androidx.appcompat.widget.SearchView;
import android.widget.LinearLayout;

import androidx.transition.TransitionManager;

import com.google.android.material.floatingactionbutton.FloatingActionButton;

public class SearchButton {
    private FloatingActionButton fab;
    private LinearLayout searchLayout;
    private SearchView searchEditText;

    public SearchButton(View view) {
        fab = view.findViewById(R.id.btn_search);
        searchLayout = view.findViewById(R.id.searchLayout);
        searchEditText = view.findViewById(R.id.search_view);

        // 검색창 초기 상태는 숨김 처리
        searchLayout.setVisibility(View.GONE);



        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (searchLayout.getVisibility() == View.VISIBLE) {
                    // 검색창이 이미 표시된 상태이면 검색 동작 수행
                    performSearch();
                } else {
                    // 검색창이 표시되지 않은 상태이면 검색창 확장
                    expandSearchLayout();
                }
            }
        });

        // 검색어 입력 필드 초기화
        clearEditText();
    }

    // 검색어 입력 필드 초기화 메서드

    private void clearEditText() {
        if (searchEditText != null) {
            searchEditText.setQuery("", true);
        }
    }

    void performSearch() {
        // 검색 동작 구현
        String searchText = searchEditText.getQuery().toString();
        Log.d("SearchButton", "검색어: " + searchText);
        // 검색어를 가져와서 원하는 동작을 수행할 수 있습니다.
    }


    void expandSearchLayout() {
        // 검색창 확장 애니메이션 및 레이아웃 변경 구현
        TransitionManager.beginDelayedTransition(searchLayout);

        // 검색창 레이아웃의 가시성 및 크기 변경
        searchLayout.setVisibility(View.VISIBLE);
        ViewGroup.LayoutParams layoutParams = searchLayout.getLayoutParams();
        layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
        searchLayout.setLayoutParams(layoutParams);

        // 추가적인 애니메이션 등을 구현할 수 있습니다.
    }

    public void openSearch() {
        if (searchLayout.getVisibility() != View.VISIBLE) {
            expandSearchLayout();
        }
    }

    public void closeSearch() {
        if (searchLayout.getVisibility() == View.VISIBLE) {
            searchLayout.setVisibility(View.GONE);
        }
    }


    public FloatingActionButton getFab() {
        return fab;
    }

    public LinearLayout getSearchLayout() {
        return searchLayout;
    }

}