I have searched high and low to try and find an answer for this problem that I'm having. Basically, I have a scrollview with lots of items that are checkboxes. I want to have a few buttons on the bottom that are 'select all' 'select none' type actions. I want the buttons to equally take up the available space (e.g. stretch so that there are no gaps). I've tried a ton of different combinations of styles for the buttons and the containers with no luck.
I have a working example here, but I'll post the code as well for convenience. Any help or direction would be greatly appreciated.
Edit: As suggested, I've looked at ButtonGroup
from react-native-elements
but I didn't like how the buttons stayed selected. Plus, I feel like this is a common issue that I've yet to find a solution to with flexbox in react native.
https://snack.expo.io/BJNEmvMvQ
import React, { Component } from 'react';
import { View, Text, ScrollView } from 'react-native';
import { CheckBox, ListItem, Button } from 'react-native-elements';
export default class App extends Component {
list = [ list of objects to render checkboxes (see snack for example ];
renderItem = (item, i) => {
return (
<View key={i}>
<CheckBox
title={item.Description}
checkedIcon="check"
uncheckedIcon="times"
/>
</View>
)
}
render() {
return (
<View style={{ flex: 1 }}>
<ScrollView>{this.list.map(this.renderItem)}</ScrollView>
<View style={{ flexDirection: 'row',
justifyContent: 'center' }}>
// have tried in the view style above: flexGrow, alignItems, and others
<Button
title="hello"
containerViewStyle={{ borderWidth: 2,
borderColor: 'black'}}
// have tried using flexGrow, alignSelf
// have also tried using 'buttonStyle' here instead of 'containerViewStyle'
/>
<Button
title="hello"
containerViewStyle={{ borderWidth: 2,
borderColor: 'black' }}
/>
<Button
title="hello"
containerViewStyle={{ borderWidth: 2,
borderColor: 'black' }}
/>
<Button
title="hello"
containerViewStyle={{ borderWidth: 2,
borderColor: 'black' }}
/>
</View>
</View>
);
}
}
There are limitations to change react native button styles. The quick solution for your problem is to wrap the Button with View.
Here is the working demo: https://snack.expo.io/SkIXThMw7
<View style={{ flex: 1 }}>
<ScrollView>{this.list.map(this.renderItem)}</ScrollView>
<View style={{flexDirection: 'row'}}>
<View style={{flex:1}} >
<Button
title="hello"
containerViewStyle={styles.buttonStyle}
>
</Button>
</View>
<View style={{flex:1}} >
<Button
title="hello"
containerViewStyle={styles.buttonStyle}
>
</Button>
</View>
<View style={{flex:1}} >
<Button
title="hello"
containerViewStyle={styles.buttonStyle}
>
</Button>
</View>
<View style={{flex:1}} >
<Button
title="hello"
containerViewStyle={styles.buttonStyle}
>
</Button>
</View>
</View>
</View>
const styles = StyleSheet.create({
buttonStyle: {
borderWidth: 1,
borderColor: 'black',
marginLeft: 0,
marginRight: 0,
paddingLeft: 0,
paddingRight: 0
},
});
I was able to figure this out with some help from the folks at react-native-elements
. I needed to remove the margin from the buttons that are there as default on the containerViewStyle
and add a flex: 1
as well. Updated snack is here. It is essentially the same as one of the other answers except you don't have to wrap the buttons in views, just apply the styles to the containerViewStyle
for each of the buttons.
import React, { Component } from 'react';
import { View, Text, ScrollView } from 'react-native';
import { CheckBox, ListItem, Button } from 'react-native-elements';
export default class App extends Component {
list = [ list of objects to render checkboxes (see snack for example ];
renderItem = (item, i) => {
return (
<View key={i}>
<CheckBox
title={item.Description}
checkedIcon="check"
uncheckedIcon="times"
/>
</View>
)
}
render() {
return (
<View style={{ flex: 1 }}>
<ScrollView>{this.list.map(this.renderItem)}</ScrollView>
<View style={{ flexDirection: 'row', justifyContent: 'center' }}>
<Button
title="hello"
containerViewStyle={{ borderWidth: 2, borderColor: 'black', marginLeft: 0, marginRight: 0, flex: 1 }}
/>
<Button
title="hello"
containerViewStyle={{ borderWidth: 2, borderColor: 'black', marginLeft: 0, marginRight: 0, flex: 1 }}
/>
<Button
title="hello"
containerViewStyle={{ borderWidth: 2, borderColor: 'black', marginLeft: 0, marginRight: 0, flex: 1 }}
/>
<Button
title="hello"
containerViewStyle={{ borderWidth: 2, borderColor: 'black', marginLeft: 0, marginRight: 0, flex: 1 }}
/>
</View>
</View>
);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With