情景描述:
從一個名為“My”的組件點擊進去,進入一個列表(該列表內容為webView中內容),其中一個webView也可以點擊進入詳情頁(也為webView),但是如果對導航欄不做任何處理,直接點擊返回按鈕,便會直接從詳情頁跳轉至最頂層頁面,而返回不到該列表內容頁;很顯然這並非我們想要的效果,於是就需要在原有導航返回事件中增加對webView返回事件的處理,完整代碼如下(由於拍的視頻格式有問題,就看不了效果圖了~~~桑心,只能湊合看看代碼了):
export class CommonProblem extends Component {//自定義一個組件
static navigationOptions = ({ navigation }) => {
return {
headerTitle: '常見問題', //導航標題
headerTitleStyle: {
alignSelf: 'center',
textAlign: 'center',
fontSize: 16,
color: '#FFF'
},
headerLeft: (
<TouchableHighlight
activeOpacity={1}
underlayColor={skin.main}
onPress={() => {
navigation.state.params.goBackPage();
}}
>
<View style={{ paddingLeft: 20 }}>
<Icon name="ios-arrow-round-back-outline" size={30} style={{ color: '#FFF' }} />
</View>
</TouchableHighlight>
),
//導航左與導航右是為了讓導航標題居中(Why?)
headerRight: <View style={{ paddingRight: 20 }} />
};
};
constructor(props) {
super(props);
this.nav = this.props.navigation;//導航
// 添加返回鍵監聽(對Android原生返回鍵的處理)
this.addBackAndroidListener(this.nav);
}
componentDidMount() {
this.props.navigation.setParams({//給導航中增加監聽事件
goBackPage: this._goBackPage
});
}
//自定義返回事件
_goBackPage = () => {
// 官網中描述:backButtonEnabled: false,表示webView中沒有返回事件,為true則表示該webView有回退事件
if (this.state.backButtonEnabled) {
this.refs['webView'].goBack();
} else {//否則返回到上一個頁面
this.nav.goBack();
}
};
//獲取鏈接
getSource() {//config.HelpProblemUrlTest是webView的地址(一個獨立的H5頁面)
if (!config.Release) {
return config.HelpProblemUrlTest;
}
return config.HelpProblemUrl;
}
onNavigationStateChange = navState => {
this.setState({
backButtonEnabled: navState.canGoBack
});
};
// 監聽原生返回鍵事件
addBackAndroidListener(navigator) {
if (Platform.OS === 'android') {
BackHandler.addEventListener('hardwareBackPress', this.onBackAndroid);
}
}
onBackAndroid = () => {
if (this.state.backButtonEnabled) {
this.refs['webView'].goBack();
return true;
} else {
return false;
}
};
render() {
let Dimensions = require('Dimensions');
let { width, height } = Dimensions.get('window');
return (
<View style={{ backgroundColor: skin.lightSeparate, flex: 1 }}>
<WebView
source={{ uri: this.getSource() }}
style={{ flex: 10, justifyContent: 'center', alignItems: 'center', width: width }}
ref="webView"
onNavigationStateChange={this.onNavigationStateChange}
/>
</View>
);
}
}
