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

Android Fragment 登錄頁刷新:同一 Fragment 內切換布局顯示/隱藏替代替換

     編輯:程式設計綜合問答

需求

登錄頁用 Fragment,未登錄顯示登錄表單,登錄成功後更新同一 Fragment 顯示用戶信息,**不想用 FragmentTransaction replace 替換**。

推薦方案:單 Fragment 內兩套布局 View 切換可見性

佈局 XML

<FrameLayout xmlns:android="..."
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 登錄表單 -->
    <LinearLayout
        android:id="@+id/llLoginForm"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:visibility="visible">
        <EditText android:id="@+id/etPhone" ... />
        <EditText android:id="@+id/etPwd" ... />
        <Button android:id="@+id/btnLogin" ... />
    </LinearLayout>

    <!-- 登錄後信息 -->
    <LinearLayout
        android:id="@+id/llUserInfo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:visibility="gone">
        <TextView android:id="@+id/tvWelcome" ... />
        <Button android:id="@+id/btnLogout" ... />
    </LinearLayout>

</FrameLayout>

Fragment 代碼

public class LoginFragment extends Fragment {
    private View llLoginForm, llUserInfo;
    private TextView tvWelcome;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_login, container, false);
        llLoginForm = root.findViewById(R.id.llLoginForm);
        llUserInfo = root.findViewById(R.id.llUserInfo);
        tvWelcome = root.findViewById(R.id.tvWelcome);

        root.findViewById(R.id.btnLogin).setOnClickListener(v -> attemptLogin());
        root.findViewById(R.id.btnLogout).setOnClickListener(v -> showLoginForm());
        return root;
    }

    private void attemptLogin() {
        String phone = ((EditText)getView().findViewById(R.id.etPhone)).getText().toString();
        String pwd = ((EditText)getView().findViewById(R.id.etPwd)).getText().toString();
        // 調用登錄 API...
        // 成功回調:
        showUserInfo("歡迎, " + phone);
    }

    private void showUserInfo(String msg) {
        llLoginForm.setVisibility(View.GONE);
        llUserInfo.setVisibility(View.VISIBLE);
        tvWelcome.setText(msg);
    }

    private void showLoginForm() {
        llUserInfo.setVisibility(View.GONE);
        llLoginForm.setVisibility(View.VISIBLE);
    }
}

優勢

  • **零 Fragment 事務開銷**,無動畫閃爍、無生命週期複雜度。
  • **狀態保持簡單**:View 隱藏不銷毀,輸入框內容自動保留(登出時可選清空)。
  • **返回鍵處理自然**:用戶按返回鍵可直接退出 Activity,無需處理回棧。

替代方案對比

方案優點缺點適用
同 Fragment 切換 View 可見性簡單、高效、狀態保持布局稍顯臃腫登錄/註冊、簡單狀態切換
FragmentTransaction replace結構清晰、符合單一職責需管理回棧、生命週期、動畫複雜業務流程、明確分離關注點
ViewPager + FragmentStatePagerAdapter滑動切換、預加載過度設計向導/引導頁

進階:ViewBinding/DataBinding 簡化代碼

// ViewBinding (buildFeatures { viewBinding true })
private FragmentLoginBinding binding;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    binding = FragmentLoginBinding.inflate(inflater, container, false);
    binding.btnLogin.setOnClickListener(v -> attemptLogin());
    return binding.getRoot();
}

private void showUserInfo(String msg) {
    binding.llLoginForm.visibility = View.GONE;
    binding.llUserInfo.visibility = View.VISIBLE;
    binding.tvWelcome.text = msg;
}

結論:**同一 Fragment 內用 View.GONE/VISIBLE 切換登錄前後態**,最輕量、最符合「不替換 Fragment」的需求。

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