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;
}
}
'Development > JAVA 앱 개발노트' 카테고리의 다른 글
(My Voca) Day 16. 현재 문제 상황 (0) | 2023.06.27 |
---|---|
(My Voca) Day 15. 현재 문제 상황 (0) | 2023.06.25 |
(My Voca) Day 14. 사전기능 및 시험문제 만들기 기능 구현 (2) | 2023.05.21 |
(My Voca) Day 13. V2 기록 (0) | 2023.05.07 |
(My Voca) Day 12. Build Process 5 (0) | 2023.04.23 |