아주 오래전에 네이버 지식인에 등록을 했었습니다. 이게 뭔가 하고... 그렇게 잊혀 지나가길 10여 년이 지났을 언제가 같이 근무하는 지인의 친구가 네이버 지식인 활동을 통해서 수입이 생긴다는 말을 들었던 시절쯤, 다시 지식인 활동을 시작했습니다. 그러다가 뜨문뜨문 하게 되어 시간이 많이 흘렀습니다.
등급이 올라가는 속도는 갈 수록 느려지는 것 같아요. 처음 몇 단계는 쉽게 올라가더니... 이제 지존 다음 단계인 초인으로 가기 위해서는 답변 채택이 200개가 더 있어야 한다고 하네요. 답변 채택률이 87% 수준이면 잘하는 건가는 모르겠지만, 비율로 치면 220개가량은 답을 달아야 한다는 결론이 나오네요.
그것도 시간으로 때워야 할 것 같은 생각이 들기는 합니다. 다만, expert 활동을 할 수 있는 조건이 완화 되었다는 소식이 있네요. 그래서 조만간 export 활동을 해 볼 수 있을 것 같습니다.
payapp api 가이드에서 설명하는 결제 연동 페이지로의 호출 부분은 위 예시된 코드와 같이 url을 호출하면 됩니다. 이번에 구현하고자 하는 앱의 경우는 결제 연동만 일단 구현해 볼 요량이므로 위 코드와 같이 구현하고, 관련된 정보를 추가로 파라미터로 전송하여 결제 연동을 위한 QRcode 이미지를 webView에 보여주는 방식으로 진행하고 있습니다.
파라미터
전달 값
cmd
payrequest (고정값 : 결제 요청시 사용)
userid
payapp 에 판매 회원으로 가입한 id
goodname
판매하는 상품명칭
price
가격
recvphone
결과를 수신받을 휴대전화번호
smsuse
sms 사용여부
위 정도는 필수값이고 그 외에도 다른 항목들이 있지만 그것은 API 문서를 참조하여 보시기 바랍니다. 이번 앱 구현에서는 이 정도만 있어도 됩니다.
MainActivity에서 사용
class MainActivity : ComponentActivity() , CoroutineScope {
..... private lateinit var job: Job override val coroutineContext: CoroutineContext get() = Dispatchers.Main + job
...
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
private fun doPunched(destinationsNavigator: DestinationsNavigator) { var errno = "" var qrUrl = "" launch(Dispatchers.Main) { val result = HttpRequestHelper().requestKtorIoInDetail() val decoded = URLDecoder.decode(result, "UTF-8") var lineItems = decoded?.split("&") if (lineItems != null) { for (line in lineItems) { Log.e("", "${line}") if (line.indexOf("errno") > -1) { errno = line.split("=")[1] } if (line.indexOf("qrurl") > -1) { qrUrl = line.split("=")[1] } } } Log.e(TAG, "${qrUrl} ${errno}") if (!"".equals(qrUrl)) { doWebView(qrUrl, destinationsNavigator) } } }
.....
fun doFinish() { job.cancel() // 종료 되게... finish() }
mainActivity에서 다른 구현이 많이 있기는 하겠지만, 코루틴 사용을 위해서 Job을 선언하는 부분 등 필요한 부분만 나열을 하였으니 코드 구현 시 참고하셔야 합니다. 위 예시 코드와 같이 launch 구문을 이용해서 위에서 작성한 helper을 호출하면 결과 값이 string으로 돌아오기 때문에 그 값을 파싱 해서 qrurl 부분만 값으로 받아오고 그 값을 전달해서 webview에 표시하는 것으로 구현은 마무리가 됩니다.
@Composable fun Url2WebView( qrUrl : String, doBackQRCode:() -> Unit ){
MaterialDialog를 구현한 것인데요. icon 은 말 그대로 알림 창에 icon 이 나옵니다 title 은 제목을 쓸 내용을 정리하면 되고요 message 에는 알림 표시용 글을 표시하면 되고, positiveButton 에는 확인 버튼을 구현하기 위한 메시지 내용과 버튼 클릭 시 동작할 action을 구현합니다. negativeButton 에는 취소 버튼을 구현하기 위한 메시지 내용과 action을 구현합니다.
입력이 있는 Dialog 구현해 보기
gradle 설정
이번에는 입력이 있는 dialog 을 구현해 보겠습니다. 먼저 gradle 설정에 추가 하여야 합니다.
// 입력 받는 다이얼로그 implementation 'com.afollestad.material-dialogs:input:3.3.0' implementation 'com.google.android.material:material:1.6.1'
저 2줄중에 위에 꺼는 원작자 링크에서 도 찾을 수 있었지만, 아래 줄은 없었습니다. 저 한 줄 때문에 에러가 나와서 찾는 데 애를 쫌 먹었습니다. 아무튼... 그리고 이번에는 style도 잘 정리가 되어야 하는 데, 결론적으로는 아래와 같이 theme.xml 파일을 정리했습니다. 원인은 Theme.AppCompat 이 아닐 경우 위에서 implementation 된 material layout이 동작하지 않는 것으로 보입니다.
#스하리1000명프로젝트, A volte è difficile parlare con i lavoratori stranieri, vero? Ho realizzato una semplice app che aiuta! Scrivi nella tua lingua e gli altri lo vedono nella loro. Si traduce automaticamente in base alle impostazioni. Super pratico per chat facili. Dai un'occhiata quando ne hai la possibilità! https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416
이전 글에서 작성했던 navigation 은 그저 화면의 이동에 중점을 두었습니다. 그러다 보니, 화면 하단에 메뉴를 달고 그 메뉴는 항상 표시가 되어야 했지만, 그렇지 못했습니다 그래서 이번에는 꼭 하단 메뉴는 그대로 두고 content 내용만 변경되는 모양으로 만들어 보기로 했습니다.
다시 원작자가 작성한 코드를 살펴보면서 따라 하기를 해 보았습니다. 먼저 참조할 소스 코드의 github 링크는 아래와 같습니다.
enum class BottomBarItem( val direction: DirectionDestination, val icon: ImageVector, @StringRes val label: Int ) { Home(HomeScreenDestination, Icons.Outlined.Home, R.string.Home), ProductItem(ProductItemScreenDestination, Icons.Outlined.ShoppingCart, R.string.productItems), Setting(ManagerScreenDestination, Icons.Outlined.Settings, R.string.Setting) }
코드를 가져오면서 잠깐의 혼돈은 onClick에 구현된 코드 작성에서 있었습니다. import 처리가 잘 되지 않아서 코드를 직접 입력하면서 해소를 하였습니다.
BespeakScaffold
이 부분은 MainActivity에서 호출한 Scaffold을 변형한 코드입니다. 원작자의 코드에서는 topbar 도 있었지만, 이번에는 사용을 하지 않을 것이기 때문에 제거하고 필요한 부분만 가져왔습니다.
def docx_to_txt(path, filename): text = docx2txt.process(path + filename).split('\n') # docx 파일의 내용이 text에 담기는데 '\n' 줄바꿈 문자 기준으로 나뉘어 리스트로 만들어 진다. newfile = os.path.splitext(filename)[0] + '.txt' f = open(os.path.join(path, newfile), 'w', encoding='UTF-8') # txt 파일 오픈(없으면 생성됨) for item in text: # text에 담긴 [[Example01], [Hello], [Hi] ...]의 요소 하나가 txt파일에 한줄로 써지게 됨. f.write(item + '\n') f.close() return newfile # {file}.txt가 리턴됨