인프런 커뮤니티 질문&답변

오영택님의 프로필 이미지
오영택

작성한 질문수

[2024] 비전공자도 가능한 React Native 앱 개발 마스터클래스

레이아웃 구성하기

섹션4. 번역기 앱 expo 버전?!

해결된 질문

작성

·

29

·

수정됨

1

계산기 앱 개발과 마찬가지로, 다음과 같은 프로젝트 설치 및 실행을 진행하였습니다.
<기종 : Android>

  1. npx create-expo-app <앱 이름> --template

  2. 세 번째(blank) :typescript 선택

  3. npx expo start를 실행

  4. expo 앱에서 QR 코드로 보기

이전 강의(레이아웃 구성하기)의 중간(7:23)에 나오는 텍스트 창을 클릭하면 UI가 따라 올라가는 것을 방지하기 위한 설정방법이 제 것에서는 나타나지 않았습니다.

 

검색 창에 windowsoftinputmode 또는 AndroidManifest를 검색해도 나타나지 않았습니다.
(아무래도, 제가 설치를 잘못해서 나타났거나 expo로 빌드했기에 나타나지 않는 것 같습니다. VSCode는 기존에 사용했던 터라 해당되지 않는 것 같습니다.)

 

이를 해결하기 위해,
Picker를 감싸고 있는 View를 Wrapper라고 이름을 변경한 후에, postion: absolute 속성을 부여했습니다.

 

+) 텍스트 입력 글자가 꽤 길어지면, 줄바꿈이 되지 않고 글자가 잘려나가는 현상이 있습니다. 이를 해결하는 방법으로는 multiline={true}를 추가해주면 됩니다.

코드는 아래와 같습니다.

import { StatusBar } from 'expo-status-bar';
import React, { useState } from 'react';
import { Text, TextInput, View, Dimensions } from 'react-native';
import Translator from 'react-native-translator';
import styled from 'styled-components/native';
import { Picker } from '@react-native-picker/picker';

const Container = styled.View`
  background-color: #181818;
  flex: 1;
  padding-top: 20px;
`;

const Wrapper = styled.View`
  position: absolute;
  top: 40px;
  left: 0;
  right: 0;
  padding-horizontal: 10px;
`;

const InputView = styled.View`
  background-color: #606060;
  height: 250px;
  justify-content: left;
  align-items: start;
  padding: 10px;
  border-radius: 10px;
  margin-bottom: 80px;
`;

const ResultView = styled(InputView)`
  background-color: #0084ff;
  margin-bottom: 10px;
`;

const App = () => {
  const [value, setValue] = useState('');
  const [result, setResult] = useState('');
  const [fromLang, setFromLang] = useState('en');
  const [toLang, setToLang] = useState('ko');

  return (
    <Container>
      <StatusBar style="light" />
      <Translator
        from={fromLang}
        to={toLang}
        value={value}
        onTranslated={(t) => setResult(t)}
      />
      <Wrapper>
        <Picker
          style={{ marginBottom: 10, backgroundColor: '#606060' }}
          selectedValue={fromLang}
          onValueChange={(itemValue) => setFromLang(itemValue)}
        >
          <Picker.Item label="한국어" value="ko" />
        </Picker>

        <InputView>
          <TextInput
            style={{ fontSize: 24, color: 'white' }}
            value={value}
            onChangeText={(t) => setValue(t)}
            multiline={true}
            placeholder="번역할 텍스트 입력"
          />
        </InputView>

        <Picker
          style={{ marginBottom: 10, backgroundColor: '#0084ff' }}
          selectedValue={toLang}
          onValueChange={(itemValue) => setToLang(itemValue)}
        >
          <Picker.Item label="영어" value="en" />
        </Picker>

        <ResultView>
          <Text style={{ fontSize: 24, color: 'white' }}>{result}</Text>
        </ResultView>
      </Wrapper>
    </Container>
  );
};

export default App;

ps) 간혹 글자를 입력하면 즉각 번역되지 않고, 번역되는 아래쪽 Picker를 클릭한 후에야 동작하긴 합니다. 이를 해결하기 위해서는 useEffect를 사용하면 해결되지만 강의에서는 다루지 않아 코드에 반영하지 않았습니다. GPT가 잘 알려주니까 궁금하신 분들은 해보시면 좋을 것 같습니다~

 

ps) 업데이트 하시면서, 영상이 잘못배치된 것 같습니다~ 번역앱 원리와 이해 부분에 코인에 관한 영상이 재생됩니다. 코인 관련, 날씨앱에서는 이상이 없었습니다~

 

좋은 강의 감사합니다~!! 덕분에 많은 도움이 되고 있습니다.

답변 2

1

안녕하세요, 인프런 AI 인턴입니다. 오영택님.

React Native 환경에서 번역기 앱 설치 및 실행 중 겪으신 문제에 대한 해결 과정과 경험을 공유해주셔서 감사합니다. 몇 가지 주의해야 할 사항과 추가적인 팁을 드리겠습니다.

UI 문제 해결

  1. windowSoftInputMode 설정 문제: windowSoftInputMode 설정은 AndroidManifest.xml 내에서 설정할 수 있으며, 이는 Expo 프로젝트에서 직접 접근하기 어렵습니다. 대신 Android 기본 심화 설정을 위해서 react-native CLI 프로젝트로 변경하거나, 장기적으로 Expo에서 제공하는 API를 활용하실 수 있습니다.

  2. Styling with position: absolute: 이러한 CSS 속성을 이용한 해결책은 때때로 UI 문제를 해결하는 임시방편으로 쓸 수 있습니다. 그러나 이 방식은 다른 기기나 환경에서 예기치 않은 동작을 야기할 수 있으니, 가능하면 더 확실한 방식으로 해결책을 찾아보시는 게 좋습니다.

텍스트 입력 시 문제

텍스트가 길어질 때 잘리는 문제를 multiline={true}를 추가하여 해결할 수 있다는 점, 매우 유용한 팁입니다.

번역 지연 이슈

번역 기능이 즉각적으로 반영되지 않음은 useEffect를 사용하여 입력 변경 시 API 호출을 설정해 해결할 수 있습니다. 이는 반응형 프로그래밍의 기본으로, 입력 변화마다 API 호출을 시도하거나 일정 시간을 지연시켜 호출을 최적화하는 방법도 있습니다.

관련 문제/질문

다른 수강생들도 비슷한 문제를 겪고 있으며, 아래의 관련 질문에서도 다양한 해결책이 논의되고 있습니다:
1. ### expo로 설치해도 되나요?
- 내용 요약: Expo를 통한 설치 과정의 차이와 설정 방법에 대해 설명하고 있습니다.
2. ### 프로젝트 생성에 대해서?
- 내용 요약: Expo 없이 프로젝트를 생성하는 방법에 대해 안내하고 있습니다.

위의 답변들이 오영택님의 문제 해결에 도움이 되기를 바랍니다. 궁금한 점이나 추가적인 도움이 필요하시면 언제든지 질문해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

오영택님의 프로필 이미지
오영택
질문자

2UI 관련 2번에 대해, 동의하여 다른 방법을 찾았을 때는 flex를 이용하는 방법이 있었습니다.
코드는 아래와 같습니다.

 

기종에 따라, 크기가 달라질 수 있어서 이상하게 나오면 값을 조정하면 될 것 같습니다~

import { StatusBar } from 'expo-status-bar';
import React, { useState } from 'react';
import { Text, TextInput, View, Platform } from 'react-native';
import Translator from 'react-native-translator';
import styled from 'styled-components/native';
import { Picker } from '@react-native-picker/picker';

const Container = styled.View`
  background-color: #181818;
  flex: 1;
`;

const MainContainer = styled.View`
  flex: 1;
  padding-horizontal: 10px;
  padding-top: ${Platform.OS === 'android' ? '40px' : '20px'};
`;

const InputView = styled.View`
  background-color: #606060;
  height: 250px;
  padding: 10px;
  border-radius: 10px;
  margin-bottom: 80px;
`;

const ResultView = styled(InputView)`
  background-color: #0084ff;
  margin-bottom: 10px;
`;

const StyledPicker = styled(Picker)`
  margin-bottom: 10px;
  height: 50px;
`;

const App = () => {
  const [value, setValue] = useState('');
  const [result, setResult] = useState('');
  const [fromLang, setFromLang] = useState('ko');
  const [toLang, setToLang] = useState('en');

  return (
    <Container>
      <StatusBar style="light" />
      <MainContainer>
        <Translator
          from={fromLang}
          to={toLang}
          value={value}
          onTranslated={(t) => setResult(t)}
        />
        
        <StyledPicker
          style={{ backgroundColor: '#606060' }}
          selectedValue={fromLang}
          onValueChange={(itemValue) => setFromLang(itemValue)}
        >
          <Picker.Item label="한국어" value="ko" />
        </StyledPicker>

        <InputView>
          <TextInput
            style={{ fontSize: 24, color: 'white' }}
            value={value}
            onChangeText={(t) => setValue(t)}
            multiline={true}
            placeholder="번역할 텍스트 입력"
            placeholderTextColor="#999"
          />
        </InputView>

        <StyledPicker
          style={{ backgroundColor: '#0084ff' }}
          selectedValue={toLang}
          onValueChange={(itemValue) => setToLang(itemValue)}
        >
          <Picker.Item label="영어" value="en" />
        </StyledPicker>

        <ResultView>
          <Text style={{ fontSize: 24, color: 'white' }}>{result}</Text>
        </ResultView>
      </MainContainer>
    </Container>
  );
};

export default App;

0

정현우님의 프로필 이미지
정현우
지식공유자

아 정말..ㅜㅜ 어떻게 보답을 드려야 될 지 감도 안잡히네요

강의 개선에 발벗고 직접 나서주셔서 눈물 나올 정도로 너무 감사드립니다. expo에서 AndroidManifest 파일이 보이지 않는 것은 말씀하신 대로 expo 파일 구조로 인해서 AndroidMenifest 파일이 없는 것 같습니다.

그리고 번역 앱 원리 이해 강의가 잘못 배치된걸 이제야 알았네요ㅠㅠ 진짜 항상 감사드립니다 수강생님 현재 질문 확인 후 바로 교체하였습니다! 실수로 코인 앱 원리 이해 영상을 넣어버린 것 같네요ㅜㅜ

정말 늘 부담만 되어 제가 담고 싶었던 것도 강의에 담지 못하여 성급하게 업로드했던 것 같은데, 응원의 말씀 정말 진심을 다해 감사드립니다 오영택님. 강의 제작/업데이트에 너무 큰 힘이 되네요,,😭

오영택님의 프로필 이미지
오영택

작성한 질문수

질문하기