Android 實(shí)現(xiàn)無(wú)網(wǎng)絡(luò)頁(yè)面切換的示例代碼
本文介紹了Android 實(shí)現(xiàn)無(wú)網(wǎng)絡(luò)頁(yè)面切換的示例代碼,分享給大家,具體如下:


實(shí)現(xiàn)思路
需求是在無(wú)網(wǎng)絡(luò)的時(shí)候顯示特定的頁(yè)面,想到要替換頁(yè)面的地方,大多都是recyclerview或者第三方recyclerview這種需要顯示數(shù)據(jù)的地方,因此決定替換掉頁(yè)面中所有的recyclerview為無(wú)網(wǎng)絡(luò)頁(yè)面
實(shí)現(xiàn)過(guò)程
1 在BaseActivity中,當(dāng)加載布局成功以后,通過(guò)id找到要替換的view,通過(guò)indexOfChild()方法,找到要替換的view的位置,再通過(guò)remove和add view來(lái)實(shí)現(xiàn),因?yàn)槭窃赽ase替換,而且使用的是findviewById,這樣子就省去了考慮fragment中的view,局限性是要替換的view的命名必須要統(tǒng)一
2 點(diǎn)擊按鈕重新請(qǐng)求數(shù)據(jù),需要重新刷新數(shù)據(jù),因此使用了無(wú)網(wǎng)絡(luò)頁(yè)面的act需要重寫(xiě)base的刷新數(shù)據(jù)方法,去重新請(qǐng)求數(shù)據(jù)。
優(yōu)缺點(diǎn)
因?yàn)橹辉赽ase中替換,因此要替換的view,id名需要一致,對(duì)比通過(guò)decorview拿到content之后遍歷所有控件獲取到要替換的view的方法效率更高,而且省去了考慮fragment的情況,通過(guò)findViewById()方法可以直接獲取到fragment中需要替換的recyclerview。
代碼實(shí)現(xiàn)
在加載布局成功初始化無(wú)網(wǎng)絡(luò)頁(yè)面
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
initNoNetView(R.id.id_xrv,R.id.rv);
}
}
需要一個(gè)工具類(lèi)用來(lái)獲取網(wǎng)絡(luò)狀態(tài)
/**
* 判斷網(wǎng)絡(luò)是否連接
*
* @param context
* @return
*/
public static boolean isConnected(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (null != connectivity) {
NetworkInfo info = connectivity.getActiveNetworkInfo();
if (null != info && info.isConnected()) {
if (info.getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
return false;
}
初始化無(wú)網(wǎng)絡(luò)頁(yè)面,定義一個(gè)不定長(zhǎng)的view的id組成的數(shù)組,參數(shù)為需要替換的view的共同的id,可以為多個(gè),會(huì)替換第一個(gè)找到的不為null的view。
private void initNoNetView(int ...ids) {
if (!OkHttpUtil.isConnected(BaseActivity.this) && !haveShowNetView) {
final List<View> viewList = new ArrayList<>();
//通過(guò)id獲取view
for (int id : ids) {
viewList.add(findViewById(id));
}
//實(shí)現(xiàn)自己的無(wú)網(wǎng)絡(luò)頁(yè)面
final View noNetView = View.inflate(BaseActivity.this, R.layout.layout_no_net, null);
noNetView.findViewById(R.id.btn_try).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!OkHttpUtil.isConnected(BaseActivity.this)) {
T.showShort(BaseActivity.this, "沒(méi)有獲取到網(wǎng)絡(luò),請(qǐng)重試...");
return;
}
//切換到有網(wǎng)絡(luò)頁(yè)面
showHaveNetView(viewList,noNetView);
}
});
//切換到無(wú)網(wǎng)絡(luò)頁(yè)面
showNoNetView(viewList,noNetView);
}
}
頁(yè)面切換
private void showHaveNetView(List<View> viewList, View noNetView) {
for (View view : viewList) {
if (view==null){
continue;
}
haveShowNetView = false;
transView(noNetView, view);
onReNetRefreshData();
break;
}
}
private void showNoNetView(List<View> viewList, View noNetView) {
for (View view : viewList) {
if (view==null){
continue;
}
haveShowNetView = true;
transView(view, noNetView);
break;
}
}
protected void transView(final View defaultView, View replaceView) {
final int index = ((ViewGroup) defaultView.getParent()).indexOfChild(defaultView);
ViewGroup.LayoutParams params = defaultView.getLayoutParams();
ViewGroup parent = (ViewGroup) defaultView.getParent();
parent.removeView(defaultView);
parent.addView(replaceView, index, params);
}
點(diǎn)擊按鈕顯示有網(wǎng)絡(luò)頁(yè)面的時(shí)候通知頁(yè)面更新數(shù)據(jù),BaseAct為空實(shí)現(xiàn),需要更新數(shù)據(jù)的頁(yè)面重寫(xiě)onReNetRefreshData()方法。
public void onReNetRefreshData() {
}
整體代碼
private boolean haveShowNetView = false;
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
initNoNetView(R.id.id_xrv,R.id.rv);
}
}
private void initNoNetView(int ...ids) {
if (!OkHttpUtil.isConnected(BaseActivity.this) && !haveShowNetView) {
final List<View> viewList = new ArrayList<>();
//通過(guò)id獲取view
for (int id : ids) {
viewList.add(findViewById(id));
}
//實(shí)現(xiàn)自己的無(wú)網(wǎng)絡(luò)頁(yè)面
final View noNetView = View.inflate(BaseActivity.this, R.layout.layout_no_net, null);
noNetView.findViewById(R.id.btn_try).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!OkHttpUtil.isConnected(BaseActivity.this)) {
T.showShort(BaseActivity.this, "沒(méi)有獲取到網(wǎng)絡(luò),請(qǐng)重試...");
return;
}
//切換到有網(wǎng)絡(luò)頁(yè)面
showHaveNetView(viewList,noNetView);
}
});
//切換到無(wú)網(wǎng)絡(luò)頁(yè)面
showNoNetView(viewList,noNetView);
}
}
private void showHaveNetView(List<View> viewList, View noNetView) {
for (View view : viewList) {
if (view==null){
continue;
}
haveShowNetView = false;
transView(noNetView, view);
onReNetRefreshData();
break;
}
}
private void showNoNetView(List<View> viewList, View noNetView) {
for (View view : viewList) {
if (view==null){
continue;
}
haveShowNetView = true;
transView(view, noNetView);
break;
}
}
public void onReNetRefreshData() {
}
protected void transView(final View defaultView, View replaceView) {
final int index = ((ViewGroup) defaultView.getParent()).indexOfChild(defaultView);
ViewGroup.LayoutParams params = defaultView.getLayoutParams();
ViewGroup parent = (ViewGroup) defaultView.getParent();
parent.removeView(defaultView);
parent.addView(replaceView, index, params);
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)移動(dòng)小球和CircularReveal頁(yè)面切換動(dòng)畫(huà)實(shí)例代碼
- Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換
- Android 中使用 ViewPager實(shí)現(xiàn)屏幕頁(yè)面切換和頁(yè)面輪播效果
- Android開(kāi)發(fā)中ViewPager實(shí)現(xiàn)多頁(yè)面切換效果
- Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換效果
- Android中使用TabHost 與 Fragment 制作頁(yè)面切換效果
- Android使用Fragment打造萬(wàn)能頁(yè)面切換框架
- Android編程之頁(yè)面切換測(cè)試實(shí)例
- Android fragment實(shí)現(xiàn)多個(gè)頁(yè)面切換效果
相關(guān)文章
Android開(kāi)發(fā)之彈出軟鍵盤(pán)工具類(lèi)簡(jiǎn)單示例
這篇文章主要介紹了Android開(kāi)發(fā)之彈出軟鍵盤(pán)工具類(lèi),結(jié)合實(shí)例形式分析了Android彈出軟鍵盤(pán)及獲取焦點(diǎn)的簡(jiǎn)單操作技巧,需要的朋友可以參考下2018-01-01
Android實(shí)現(xiàn)手機(jī)拍照功能
這篇文章主要介紹了Android實(shí)現(xiàn)手機(jī)拍照功能,感興趣的小伙伴們可以參考一下2015-12-12
Android實(shí)現(xiàn)網(wǎng)易新聞客戶端側(cè)滑菜單(2)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)網(wǎng)易新聞客戶端側(cè)滑菜單第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android Handler消息派發(fā)機(jī)制源碼分析
這篇文章主要為大家詳細(xì)分析了Android Handler消息派發(fā)機(jī)制源碼,感興趣的小伙伴們可以參考一下2016-07-07
Android GridView實(shí)現(xiàn)橫向列表水平滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android GridView實(shí)現(xiàn)橫向列表水平滾動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android封裝高德地圖定位工具類(lèi)Util的詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于Android封裝高德地圖定位工具類(lèi)Util的相關(guān)資料,封裝成工具類(lèi)后非常方便以后的項(xiàng)目,可以直接使用,文中也給出了詳細(xì)的實(shí)例代碼,需要的朋友可以參考下2021-07-07
基于startActivityForResult方法處理兩個(gè)Activity之間數(shù)據(jù)傳遞問(wèn)題
這篇文章主要介紹了基于startActivityForResult方法處理兩個(gè)Activity之間數(shù)據(jù)傳遞問(wèn)題的相關(guān)資料,需要的朋友可以參考下2015-11-11
Android 實(shí)現(xiàn)自定義圓形listview功能的實(shí)例代碼
這篇文章主要介紹了Android 實(shí)現(xiàn)自定義圓形listview功能的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Android音樂(lè)播放器簡(jiǎn)單實(shí)現(xiàn)案例
我們平時(shí)長(zhǎng)時(shí)間打代碼的時(shí)候肯定會(huì)感到疲憊和乏味,這個(gè)時(shí)候一邊播放自己喜歡的音樂(lè),一邊繼續(xù)打代碼,心情自然也愉快很多。音樂(lè)帶給人的聽(tīng)覺(jué)享受是無(wú)可比擬的,動(dòng)聽(tīng)的音樂(lè)可以愉悅?cè)说纳硇?,讓人更加積極地去熱愛(ài)生活,這篇文章主要介紹了Android音樂(lè)播放器簡(jiǎn)單實(shí)現(xiàn)案例2022-12-12

