-1
I have the following React Native component which is a screen to fill in data from an activity:
import React, { useState } from 'react';
import { View, Text, TextInput, TouchableOpacity, Switch, ScrollView } from "react-native";
import BarraSuperior from "../../Recursos/BarraSuperior/Index";
import Estilos from './Styles';
import Atividades from '../../Services/sqlite/Atividades';
import DateTimePicker from '@react-native-community/datetimepicker';
import { Feather } from '@expo/vector-icons';
import normalizador from '../../Recursos/normalizador';
import { useNavigation, DrawerActions } from '@react-navigation/native';
export default function Cadastro() {
//Define os dados do CRUD
const [titulo, setTitulo] = useState('')
const [categoria, setCategoria] = useState('')
const [descricao, setDescricao] = useState('')
const [btn, setBtn] = useState(false)
const [date, setDate] = useState(new Date());
//Métodos do DateTimePicker
const [mode, setMode] = useState('date');
const [show, setShow] = useState(false);
const Navigation = useNavigation()
// Navigation.dispatch(DrawerActions.openDrawer())
function NavigateToAtividades() {
Navigation.navigate('Atividades')
}
const onChange = (event, selectedDate) => {
const currentDate = selectedDate || date;
setShow(Platform.OS === 'ios');
setDate(currentDate);
};
// Muda setShow para true o que faz com que DateTimePicker apareça na tela.
const showMode = (currentMode) => {
setShow(true);
setMode(currentMode);
};
//Altera o modo de exibição para DatePicker
const showDatepicker = () => {
showMode('date');
};
//Altera o modo de exibição para TimePicker
const showTimepicker = () => {
showMode('time');
};
//Formata a data que vai ser mostrada no campo de seleção da data
const formatData = () => {
let dia = date.getDate();
let mes = date.getMonth();
let ano = date.getFullYear();
if (dia.toString().length === 1) {
dia = '0' + dia
}
if (mes.toString().length === 1) {
mes = '0' + (mes + 1)
}
return dia + '/' + mes + '/' + ano
}
//Formata as horas e minutos que vão ser mostrados no campo de seleção de tempo
const formatTime = () => {
let hora = date.getHours()
let minutos = date.getMinutes()
if (hora.toString().length === 1) {
hora = '0' + hora
}
if (minutos.toString().length === 1) {
minutos = '0' + minutos
}
return hora + ':' + minutos
}
//Setter para os campos de texto e botões
const reset = () => {
setBtn(false);
setCategoria(' ');
setTitulo(' ');
setDescricao(' ');
setDate(new Date());
}
//Passa os dados para o CRUD
const save = () => {
//Verifica se nenhum dos campos obrigatórios estão vazios, se não, é passado os dados para o banco de dados e o usuário é retornardo para a tela de Atividades. Se algum campo estiver vazio, será retornado um Alert
if (titulo === '' || titulo === ' ') {
return alert('Digite o Titulo')
} else if (categoria === '' || categoria === ' ') {
return alert('Digite a categoria')
} else {
Atividades.create({ titulo: titulo, categoria: categoria, descricao: descricao, data: date.toString(), notificar: btn, atrasado: false, concluida: false, dataConcluida: '' })
.then(alert('Adicionado com sucesso!'))
.catch(err => console.log(err))
reset()
NavigateToAtividades()
}
}
return (
<View style={Estilos.mainView}>
<BarraSuperior
conteudo='Nova tarefa'
onPress={() => Navigation.dispatch(DrawerActions.openDrawer())}
valor={false}
/>
<View style={{flex: 1,justifyContent: 'center', padding: '1%'}}>
<View style={Estilos.secondaryView}>
<Text style={Estilos.titulos}>Título da tarefa</Text>
<TextInput
style={Estilos.campos}
value={titulo}
onChangeText={text => setTitulo(text)}
/>
<Text style={Estilos.titulos}>Categoria</Text>
<TextInput
style={Estilos.campos}
value={categoria}
onChangeText={categoria => setCategoria(categoria)}
/>
<Text style={Estilos.titulos}>Descrição<Text style={Estilos.descricao}> (Opcional)</Text></Text>
<TextInput
style={Estilos.textoInput}
value={descricao}
multiline
scrollEnabled={true}
onChangeText={text => setDescricao(text)}
/>
<Text style={Estilos.titulos}>Data</Text>
<View style={Estilos.data}>
<Feather
name='calendar'
color='gold'
size={normalizador.widthPercentageToDP('4%')}
/>
<TouchableOpacity onPress={showDatepicker}>
<Text style={Estilos.textoData}>{formatData()}</Text>
</TouchableOpacity>
<Feather
name='clock'
color='gold'
size={normalizador.widthPercentageToDP('4%')}
/>
<TouchableOpacity onPress={showTimepicker}>
<Text style={Estilos.textoData}>{formatTime()}</Text>
</TouchableOpacity>
</View>
<View style={Estilos.viewSwitch}>
<Text style={Estilos.notificar}>Noticar</Text>
<Switch
trackColor={{ false: '#dedede', true: '#3e7fff' }}
thumbColor={btn ? '#7eaaff' : '#dedede'}
value={btn}
onValueChange={() => { setBtn(!btn) }}
/>
</View>
</View>
</View>
<TouchableOpacity style={Estilos.Btn} onPress={save}>
<Text style={Estilos.textBtn}>Adicionar</Text>
</TouchableOpacity>
{show && (
<DateTimePicker
minimumDate={new Date}
testID="dateTimePicker"
value={date}
mode={mode}
is24Hour={true}
display="default"
onChange={onChange}
/>
)}
</View>
)
}
With the following formatting:
import {StyleSheet} from "react-native";
import normalizador from "../../Recursos/normalizador";
export default StyleSheet.create({
textoData: {
fontWeight: 'bold',
fontSize: normalizador.widthPercentageToDP('3%'),
color: 'white'
},
descricao : {
fontFamily: 'Poppins_400Regular',
fontSize : normalizador.widthPercentageToDP('2%')
},
data: {
alignItems: 'center',
justifyContent: 'space-evenly',
padding: '3%',
flexDirection: 'row',
position: 'relative',
backgroundColor: 'blue',
width: '60%',
height: '8%',
borderRadius: 20
},
textBtn: {
color: '#FFF',
fontFamily: 'Poppins_600SemiBold',
fontSize: normalizador.widthPercentageToDP('4%')
},
Btn: {
minHeight: '7%',
minWidth: '35%',
backgroundColor: 'blue',
borderRadius: 20,
alignItems: 'center',
justifyContent: 'center'
},
textoInput : {
padding: '3%',
width: '95%',
height: '30%',
borderWidth: 1,
borderColor: '#d9d9d9',
borderRadius: 20
},
secondaryView: {
justifyContent: 'space-between',
flex: 1,
backgroundColor: '#FFF',
elevation: 20,
borderRadius: 20,
padding: '4%'
},
mainView : {
flex: 1,
alignItems: 'stretch'
},
titulos: {
fontFamily: 'Poppins_700Bold',
fontSize: normalizador.widthPercentageToDP('4%'),
color: 'black',
},
campos: {
width: '95%',
height: '8%',
borderWidth: 1,
borderColor: '#d9d9d9',
borderRadius: 20
},
viewSwitch: {
justifyContent: 'center',
alignItems: 'center'
},
notificar: {
fontSize: normalizador.widthPercentageToDP('3%')
}
})
My problem is that every time I open the keyboard to type the text the screen components are resized instead of them simply moving up, example:
Screen without opening Textinput:
Screen after opening Textinput:
What can I do to fix this formatting error?
Thank you very much! Actually, after several attempts I realized that the components were being resized based on the screen size available after the keyboard opening. Just didn’t know how to fix the size of the components using percentage (your dirt). So, I used your idea to solve the problem and the answer dirt below to improve the experience of using the app.
– Pedro Vinicius