Yanıtlar:
Aklımın ucunda bunu bir ScrollView ile yapabilirsiniz . Üst düzey kapsayıcınız, içinde bir ScrollView ve altta altbilginiz bulunan esnek bir kapsayıcı olabilir. Ardından ScrollView'a uygulamanızın geri kalanını normal şekilde yerleştirin.
Colin'in Ramsay cevabına dayanan gerçek kod:
<View style={{flex: 1}}>
<ScrollView>main</ScrollView>
<View><Text>footer</Text></View>
</View>
Uygulamamdaki düğmeler için sabit altbilgiler kullanıyorum. Sabit bir altbilgi uygulama şeklim şu şekildedir:
<View style={{flex: 1}}>
<View><Text>my text</Text></View>
<View style={{position: 'absolute', left: 0, right: 0, bottom: 0}}><Text>My fixed footer</Text></View>
</View>
Ve örneğin bir klavye göründüğünde altbilginin yukarı çıkması gerekiyorsa, şunları kullanabilirsiniz:
const { DeviceEventEmitter } = React
class MyClass {
constructor() {
this.state = {
btnLocation: 0
}
}
componentWillMount() {
DeviceEventEmitter.addListener('keyboardWillShow', this.keyboardWillShow.bind(this))
DeviceEventEmitter.addListener('keyboardWillHide', this.keyboardWillHide.bind(this))
}
keyboardWillShow(e) {
this.setState({btnLocation: e.endCoordinates.height})
}
keyboardWillHide(e) {
this.setState({btnLocation: 0})
}
}
Ardından, sabit altbilgi sınıfınızda {bottom: this.state.btnLocation} kullanın. Umarım bu yardımcı olur!
import { Keyboard} from 'react-native'; Keyboard.addListener('keyboardWillShow', this.showHandler)yerine deneyin .
Önce Dimension'ı alırsınız ve sonra onu esnek stil ile işlersiniz
var Dimensions = require('Dimensions')
var {width, height} = Dimensions.get('window')
Oluşturmada
<View style={{flex: 1}}>
<View style={{width: width, height: height - 200}}>main</View>
<View style={{width: width, height: 200}}>footer</View>
</View>
Diğer yöntem de esnek kullanmaktır
<View style={{flex: 1}}>
<View style={{flex: .8}}>main</View>
<View style={{flex: .2}}>footer</View>
</View>
@Alexander Çözüm için teşekkürler
Aşağıda tam olarak aradığınız kod var
import React, {PropTypes,} from 'react';
import {View, Text, StyleSheet,TouchableHighlight,ScrollView,Image, Component, AppRegistry} from "react-native";
class mainview extends React.Component {
constructor(props) {
super(props);
}
render() {
return(
<View style={styles.mainviewStyle}>
<ContainerView/>
<View style={styles.footer}>
<TouchableHighlight style={styles.bottomButtons}>
<Text style={styles.footerText}>A</Text>
</TouchableHighlight>
<TouchableHighlight style={styles.bottomButtons}>
<Text style={styles.footerText}>B</Text>
</TouchableHighlight>
</View>
</View>
);
}
}
class ContainerView extends React.Component {
constructor(props) {
super(props);
}
render() {
return(
<ScrollView style = {styles.scrollViewStyle}>
<View>
<Text style={styles.textStyle}> Example for ScrollView and Fixed Footer</Text>
</View>
</ScrollView>
);
}
}
var styles = StyleSheet.create({
mainviewStyle: {
flex: 1,
flexDirection: 'column',
},
footer: {
position: 'absolute',
flex:0.1,
left: 0,
right: 0,
bottom: -10,
backgroundColor:'green',
flexDirection:'row',
height:80,
alignItems:'center',
},
bottomButtons: {
alignItems:'center',
justifyContent: 'center',
flex:1,
},
footerText: {
color:'white',
fontWeight:'bold',
alignItems:'center',
fontSize:18,
},
textStyle: {
alignSelf: 'center',
color: 'orange'
},
scrollViewStyle: {
borderWidth: 2,
borderColor: 'blue'
}
});
AppRegistry.registerComponent('TRYAPP', () => mainview) //Entry Point and Root Component of The App
Ekran görüntüsü aşağıdadır
Ayrıca, NativeBase'e ( http://nativebase.io ) göz atmak isteyebilirsiniz . Bu, Başlıklar ve Altbilgiler dahil olmak üzere bazı güzel düzen yapıları ( http://nativebase.io/docs/v2.0.0/components#anatomy ) içeren React Native için bileşenlerden oluşan bir kitaplıktır .
Biraz Mobil için Bootstrap'e benziyor.
Burada basit şeyler:
Bu yaklaşım için bir ScrollView'a ihtiyacınız yoksa, bunun gibi bir şey elde etmek için aşağıdaki kodu kullanabilirsiniz:
<View style={{flex: 1, backgroundColor:'grey'}}>
<View style={{flex: 1, backgroundColor: 'red'}} />
<View style={{height: 100, backgroundColor: 'green'}} />
</View>
Aşağıda, yukarıdaki altbilgi ve öğeleri ayarlama kodu verilmiştir.
import React, { Component } from 'react';
import { StyleSheet, View, Text, ScrollView } from 'react-native';
export default class App extends Component {
render() {
return (
<View style={styles.containerMain}>
<ScrollView>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
<Text> Main Content Here</Text>
</ScrollView>
<View style={styles.bottomView}>
<Text style={styles.textStyle}>Bottom View</Text>
</View>
</View>
);
}
}
const styles = StyleSheet.create({
containerMain: {
flex: 1,
alignItems: 'center',
},
bottomView: {
width: '100%',
height: 50,
backgroundColor: '#EE5407',
justifyContent: 'center',
alignItems: 'center',
position: 'absolute',
bottom: 0,
},
textStyle: {
color: '#fff',
fontSize: 18,
},
});
Bunu yapmamın yolu, flex 1 ile bir görünüme sahip olmaktı (buna P diyelim), ardından bu görünümün içinde sırasıyla flex 0.9 ve 0.1 ile 2 görünüm daha (C1 ve C2) elde etmekti (flex yüksekliklerini gerekli değerlere değiştirebilirsiniz) . Ardından, C1'in içinde bir kaydırma görünümüne sahip olun. Bu benim için mükemmel çalıştı. Aşağıdaki örnek.
<View style={{flex: 1}}>
<View style={{flex: 0.9}}>
<ScrollView>
<Text style={{marginBottom: 500}}>scrollable section</Text>
</ScrollView>
</View>
<View style={{flex: 0.1}}>
<Text>fixed footer</Text>
</View>
</View>
Benzer bir şey elde edilebilir. position: absolute
let footerStyle = {
position: 'absolute',
bottom: 0,
}
Yine de akılda tutulması gereken birkaç şey var.
absolute öğeyi üst öğeye göre konumlandırır.Pratik bir stil tanımı şuna benzer:
import { Dimensions } from 'react-native';
var screenWidth = Dimensions.get('window').width; //full screen width
let footerStyle = {
position: 'absolute',
bottom: 0,
width: screenWidth,
height: 60
}
Flex kullanmayı en basit çözüm olarak buldum.
<View style={{flex:1,
justifyContent: 'space-around',
alignItems: 'center',
flexDirection: 'row',}}>
<View style={{flex:8}}>
//Main Activity
</View>
<View style={{flex:1}}>
//Footer
</View>
</View>
Flex pozitif bir sayı olduğunda, bileşeni esnek hale getirir ve esnek değeriyle orantılı olarak boyutlandırılır. Dolayısıyla, flex değeri 2 olan bir bileşen, flex 1 olarak ayarlanmış bir bileşene göre iki kat daha fazla yer kaplar.
<View style={{flex: 1}>
<ScrollView>
//your scroll able content will be placed above your fixed footer content.
//when your content will grow bigger and bigger it will hide behind
//footer content.
</ScrollView>
<View style={styles.footerContainer}>
//your fixed footer content will sit fixed below your screen
</View>
</View>
En iyi yol justifyContent özelliğini kullanmaktır
<View style={{flexDirection:'column',justifyContent:'flex-end'}}>
<View>
<Text>fixed footer</Text>
</View>
</View>
Ekranda birden fazla görünüm öğeniz varsa,
<View style={{flexDirection:'column',justifyContent:'space-between'}}>
<View>
<Text>view 1</Text>
</View>
<View>
<Text>view 2</Text>
</View>
<View>
<Text>fixed footer</Text>
</View>
</View>
import {Dimensions} from 'react-native'
const WIDTH = Dimensions.get('window').width;
const HEIGHT = Dimensions.get('window').height;
sonra bu stilleri yaz
position: 'absolute',
top: HEIGHT-80,
left: 0,
right: 0,
bir cazibe gibi çalıştı
Bununla ilgili Android sorunları için:
app / src / AndroidManifest.xml dosyasında windowSoftInputMode'u aşağıdaki gibi değiştirin.
<activity
android:windowSoftInputMode="stateAlwaysHidden|adjustPan">
React-native ve keyboardAwareScroll kullanarak ios'ta bununla kesinlikle hiçbir sorun yaşamadım. Birisi bana bu çözümü verene kadar bunu çözmek için bir ton kod uygulamak üzereydim. Mükemmel çalıştı.
sadece react native kullanıyorsanız, aşağıdaki kodu kullanabilirsiniz
<View style={{flex:1}}>
{/* Your Main Content*/}
<View style={{flex:3}}>
<ScrollView>
{/* Your List View ,etc */}
</ScrollView>
</View>
{/* Your Footer */}
<View style={{flex:1}}>
{/*Elements*/}
</View>
</View>
ayrıca, react native projenizde https://docs.nativebase.io/ kullanabilir ve ardından aşağıdaki gibi bir şey yapabilirsiniz.
<Container>
{/*Your Main Content*/}
<Content>
<ScrollView>
{/* Your List View ,etc */}
</ScrollView>
</Content>
{/*Your Footer*/}
<Footer>
{/*Elements*/}
</Footer>
</Container>
Manifest dosyanızda android: windowSoftInputMode = "AdjustPan" değerini ayarlayın ve beklediğiniz gibi çalışacaktır.
Bence en iyisi ve kolay olanı aşağıdaki gibi olacaktır, sadece görünümünüzün geri kalanını bir içeriğe ve altbilgiyi ayrı bir görünüme yerleştirin.
`<Container>
<Content>
<View>
Ur contents
</View>
</Content>
<View>
Footer
</View>
</Container>`
veya yerel tabandaki altbilgiyi kullanabilirsiniz
`<Container>
<Content>
<View>
Ur contents
</View>
</Content>
<Footer>
Footer
</Footer>
</Container>`
Öneri 1
=> Sabit alt bilgili gövde
<View style={{ flex: 1, backgroundColor: 'gray' }}>
<View style={{ flex: 9, backgroundColor: 'gray',alignItems: 'center', justifyContent: 'center', }}>
<Text style={{color:'white'}}>...Header or Body</Text>
</View>
<View style={{ flex: 1, backgroundColor: 'yellow', alignItems: 'center', justifyContent: 'center', }}>
<Text>...Footer</Text>
</View>
</View>
Düzenle 2
=> Sekmeli Gövde ve Sabit altbilgi
<View style={{ flex: 1, backgroundColor: 'gray' }}>
<View style={{ flex: 9, backgroundColor: 'gray', alignItems: 'center', justifyContent: 'center', }}>
<Text style={{ color: 'white' }}>...Header or Body</Text>
</View>
<View style={{ flex: 1, backgroundColor: 'yellow', alignItems: 'center', justifyContent: 'center', }}>
<View style={{ flex: 1, flexDirection: 'row' }}>
<TouchableOpacity style={{ flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: 'white' }}>
<View>
<Text>
...Home
</Text>
</View>
</TouchableOpacity>
<TouchableOpacity style={{ flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: 'white' }}>
<View>
<Text>
...Settings
</Text>
</View>
</TouchableOpacity>
</View>
</View>
</View>
notlar
import {TouchableOpacity} in 'react-native'
Avantajları
Bu basit altbilgiyi, alt gezinmeye tepki vermeden kullanabiliriz
heightaltbilgi görünümüne yeni eklendi ve 4s ve 6