首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 單 Activity 多頁面切換方案:View 替換 vs Fragment vs setContentView 重載

     編輯:程式設計綜合問答

場景:測驗應用 14 道題,點擊「下一題」切換頁面。若每題創建一個 Activity 會導致棧溢出、切換延遲、狀態管理困難。本文提供三種單 Activity 解決方案。

方案一:TextView 內容替換(最輕量,適合純文本題)

// 佈局:一個 TextView + 一個 Button
TextView questionTv = findViewById(R.id.question);
Button nextBtn = findViewById(R.id.next);
String[] questions = { "Q1...", "Q2...", ... };
int index = 0;

nextBtn.setOnClickListener(v -> {
    index = (index + 1) % questions.length;
    questionTv.setText(questions[index]);
});

方案二:View 組動態切換(適合佈局差異大)

ViewGroup container = findViewById(R.id.container);
View currentView;

nextBtn.setOnClickListener(v -> {
    container.removeAllViews();
    // 方案 A:inflate 新佈局
    currentView = LayoutInflater.from(this).inflate(R.layout.question2, container, false);
    container.addView(currentView);
    // 初始化新 View 的子控件...
    
    // 方案 B:預加載所有 View,切換可見性
    // views[index].setVisibility(View.VISIBLE);
    // views[preIndex].setVisibility(View.GONE);
});

方案三:setContentView 重載(簡單粗暴,會銷毀舊視圖樹)

nextBtn.setOnClickListener(v -> {
    index = (index + 1) % layouts.length;
    setContentView(layouts[index]); // 完全重建視圖
    // 必須重新 findViewById、綁定監聽器
    bindViews();
});

方案對比與推薦

方案優點缺點適用場景
TextView 替換零開銷、狀態保持簡單佈局固定、無法支持複雜 UI 差異純文本/選項題
View 切換佈局靈活、可預加載需手動管理子 View 生命周期每題 UI 差異大
setContentView代碼隔離、佈局文件獨立銷毀重建開銷大、易丟失狀態原型驗證、極簡項目
Fragment (推薦)生命周期托管、回棧支持、動畫豐富、架構標準學習成本稍高所有生產項目

Fragment 標準實現骨架

// Activity
viewPager = findViewById(R.id.viewPager);
viewPager.setAdapter(new FragmentStateAdapter(this) {
    @NonNull @Override public Fragment createFragment(int pos) {
        return QuestionFragment.newInstance(questions[pos]);
    }
    @Override public int getItemCount() { return questions.length; }
});

// Fragment
public class QuestionFragment extends Fragment {
    static QuestionFragment newInstance(String q) { ... }
    @Nullable @Override View onCreateView(...) { 
        // inflate 佈局、綁定數據
    }
}

棄用多 Activity 方案,擁抱單 Activity + Fragment/Flow 架構,構建流暢可維護的應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved