You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新Gradle、Java和Android Studio后Fragment无法正常加载视图

Android Fragment布局元素不显示问题(Gradle/Java/AS更新后)

更新Gradle、Java和Android Studio后,底部导航切换Fragment功能正常,但Fragment布局内的RecyclerView和按钮无法显示。


核心问题排查与修复

1. 主布局容器层级冲突

activity_main.xml中,承载Fragment的FrameLayout(id=container)内部额外嵌套了一个RecyclerView,该View属于Activity布局,会覆盖Fragment的内容,导致Fragment控件被遮挡。

修复:
删除FrameLayout内部的RecyclerView,修改后代码:

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/toolbar"/>

2. Fragment布局的控件位置与尺寸问题

  • fragment_habit.xml中RecyclerView高度设为wrap_content,若初始数据为空会导致高度为0,视觉上呈现“不显示”;
  • 按钮的layout_marginBottom使用了字体单位sp,应改用布局单位dp;
  • RecyclerView未设置与按钮的位置关系,可能出现重叠。

优化:
调整RecyclerView高度为match_parent,并添加layout_above规则避免与按钮重叠,同时修正按钮的margin单位:

<Button
    android:id="@+id/createNewHabitBtn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Create new habit"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="50dp"/>

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/habitsRecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:padding="10dp"
    android:layout_above="@id/createNewHabitBtn"/>

3. Fragment实例复用与生命周期适配

提前初始化Fragment实例的方式,在更新后的AndroidX环境下可能引发状态管理异常,建议通过FragmentManager的标签复用机制优化:

修改MainActivity中的Fragment切换逻辑:

bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.container);
        Fragment targetFragment = null;
        String tag = "";

        if (item.getItemId() == R.id.habits) {
            tag = "HABIT_FRAG";
            targetFragment = getSupportFragmentManager().findFragmentByTag(tag);
            if (targetFragment == null) {
                targetFragment = new HabitFrag();
            }
        } else if (item.getItemId() == R.id.dailies) {
            tag = "DAILIES_FRAG";
            targetFragment = getSupportFragmentManager().findFragmentByTag(tag);
            if (targetFragment == null) {
                targetFragment = new DailiesFrag();
            }
        } else if (item.getItemId() == R.id.todos) {
            tag = "TODOS_FRAG";
            targetFragment = getSupportFragmentManager().findFragmentByTag(tag);
            if (targetFragment == null) {
                targetFragment = new TodosFrag();
            }
        } else if (item.getItemId() == R.id.rewards) {
            tag = "REWARDS_FRAG";
            targetFragment = getSupportFragmentManager().findFragmentByTag(tag);
            if (targetFragment == null) {
                targetFragment = new RewardsFrag();
            }
        }

        if (targetFragment != null && !targetFragment.equals(currentFragment)) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.container, targetFragment, tag)
                    .commit();
        }
        return true;
    }
});

4. 空数据状态处理

若数据库返回空列表,RecyclerView会显示空白,建议添加空状态提示:
在HabitFrag的onResumeFragment方法中补充逻辑:

if (allHabits.isEmpty()) {
    // 需先在fragment_habit.xml中添加id为emptyView的TextView作为空提示
    TextView emptyView = view.findViewById(R.id.emptyView);
    emptyView.setVisibility(View.VISIBLE);
    habitsRecyclerView.setVisibility(View.GONE);
} else {
    TextView emptyView = view.findViewById(R.id.emptyView);
    emptyView.setVisibility(View.GONE);
    habitsRecyclerView.setVisibility(View.VISIBLE);
    adapter.setHabits(allHabits);
    adapter.notifyDataSetChanged();
}

原问题代码

ActivityMain.java

package com.example.goalhero;

import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;


public class MainActivity extends AppCompatActivity {

    private BottomNavigationView bottomNavigationView;

    private HabitFrag habitFrag = new HabitFrag();
    private DailiesFrag dailiesFrag = new DailiesFrag();
    private TodosFrag todosFrag = new TodosFrag();
    private RewardsFrag rewardsFrag = new RewardsFrag();

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toolbar_menu, menu);
        return true;
    }

    // Helper method to show the PopupWindow
    void showPopupWindow() {
        // Inflate the popup_layout.xml
        View popupView = LayoutInflater.from(this).inflate(R.layout.image_popup, findViewById(R.id.main_layout), false);

        // Create the PopupWindow
        PopupWindow popupWindow = new PopupWindow(
                popupView,
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
        );

        // Set background color for the popup window (optional)
        popupWindow.setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

        // Set animation style for the popup window (optional)
        popupWindow.setAnimationStyle(android.R.style.Animation_Dialog);

        // Get references to the views inside the popup layout
        ImageView imageViewReward = popupView.findViewById(R.id.imageViewReward);
        TextView goodJobMessage = popupView.findViewById(R.id.goodJobMessage);
        Button closeButton = popupView.findViewById(R.id.closeButton);
        TextView congratsText = popupView.findViewById(R.id.CongratsText);

        // Set layout parameters for each view
        RelativeLayout.LayoutParams congratsTextParams = new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
        );
        congratsTextParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
        congratsTextParams.setMargins(0, 0, 0, 120);  // Adjusted top margin
        congratsText.setLayoutParams(congratsTextParams);

        RelativeLayout.LayoutParams imageViewParams = new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
        );
        imageViewParams.addRule(RelativeLayout.BELOW, R.id.CongratsText);  // Positioned below Congratulations!
        imageViewParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
        imageViewReward.setLayoutParams(imageViewParams);

        RelativeLayout.LayoutParams goodJobMessageParams = new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
        );
        goodJobMessageParams.addRule(RelativeLayout.BELOW, R.id.imageViewReward);
        goodJobMessageParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
        goodJobMessageParams.setMargins(0, 120, 0, 0);  // Adjusted top margin
        goodJobMessage.setLayoutParams(goodJobMessageParams);

        RelativeLayout.LayoutParams closeButtonParams = new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
        );
        closeButtonParams.addRule(RelativeLayout.BELOW, R.id.imageViewReward);
        closeButtonParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
        closeButtonParams.setMargins(0, 240, 0, 0);
        closeButton.setLayoutParams(closeButtonParams);

        // Set click listener for the close button
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Close the popup window
                popupWindow.dismiss();
            }
        });

        // Show the popup window in the center
        popupWindow.showAtLocation(findViewById(R.id.main_layout), Gravity.CENTER, 0, 0);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        System.out.println("Setting the layout to the activity_main.xml");
        setContentView(R.layout.activity_main);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);



        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {

                if (item.getItemId() == R.id.action_profile) {

                    Intent intent = new Intent(MainActivity.this, ProfilePage.class);
                    startActivity(intent);

                    return true;

                } else if (item.getItemId() == R.id.action_settings){

                    return true;

                } else if (item.getItemId() == R.id.action_dashboard){

                    return true;

                } else if (item.getItemId() == R.id.action_notifications){

                    return true;

                } else if (item.getItemId() == R.id.action_logout){

                    return true;

                }

                return false;
            }
        });

        bottomNavigationView = findViewById(R.id.bottom_navigation);

        getSupportFragmentManager().beginTransaction().replace(R.id.container, habitFrag).commit();
        bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem item) {

                if (item.getItemId() == R.id.habits) {
                    getSupportFragmentManager().beginTransaction().replace(R.id.container, habitFrag).commit();
                    return true;
                } else if (item.getItemId() == R.id.dailies) {
                    getSupportFragmentManager().beginTransaction().replace(R.id.container, dailiesFrag).commit();
                    return true;
                } else if (item.getItemId() == R.id.todos) {
                    getSupportFragmentManager().beginTransaction().replace(R.id.container, todosFrag).commit();
                    return true;
                } else if (item.getItemId() == R.id.rewards) {
                    getSupportFragmentManager().beginTransaction().replace(R.id.container, rewardsFrag).commit();
                    return true;
                }

                return false;
            }
        });

    }

}

HabitFrag.java

package com.example.goalhero;

import static android.app.Activity.RESULT_OK;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;

public class HabitFrag extends Fragment {
    private Button createNewHabitButton;
    private RecyclerView habitsRecyclerView;
    HabitsRecyclerViewAdapter adapter;
    final int requestCodeForCreateNewHabitActivityCall = 1;
    private DataBaseHelper dbHelper;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        System.out.println("Made it here. (onCreate)");
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onAttach(@NonNull Context context) {

        System.out.println("Made it here. (onAttach)");
        super.onAttach(context);
        dbHelper = new DataBaseHelper(context, "HABITS_DATABASE");
    }

    public void onResumeFragment() {

        System.out.println("Made it here. (onResumeFragment)");
        // This method will be called when the fragment's onResume is triggered
        // You can place your code here to retrieve and update data
        Context context = getContext();
        ArrayList<Habit> allHabits = dbHelper.getAll();

        // Sets the list of habits on the screen
        adapter.setHabits(allHabits);
        habitsRecyclerView.setAdapter(adapter);
        habitsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    }

    @Override
    public void onResume() {
        System.out.println("Made it here. (onResume)");

        super.onResume();
        onResumeFragment();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        System.out.println("Made it here. (onViewCreated)");

        habitsRecyclerView = view.findViewById(R.id.habitsRecyclerView);

        // Initialize the adapter here
        adapter = new HabitsRecyclerViewAdapter(getContext(), dbHelper);
        habitsRecyclerView.setAdapter(adapter);
        habitsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        createNewHabitButton = view.findViewById(R.id.createNewHabitBtn);
        createNewHabitButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getContext(), CreateNewHabitActivity.class);
                startActivityForResult(intent, requestCodeForCreateNewHabitActivityCall);
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 1 && resultCode == RESULT_OK) {
            // Retrieve habit information from the result intent and add it to the database
            assert data != null;
            String habitInfo = data.getStringExtra("habitInfo");
            boolean isEasy = data.getBooleanExtra("isEasy", true);
            String timeFrame = data.getStringExtra("habitTimeFrame");

            if (timeFrame == null) {
                dbHelper.addOne(new Habit(habitInfo, 0, isEasy));
            } else {
                dbHelper.addOne(new Habit(habitInfo, 0, isEasy, timeFrame));
            }

            // Retrieve all habits from the database after adding the new one
            ArrayList<Habit> allHabits = dbHelper.getAll();

            // Update the RecyclerView adapter with the new list of habits
            adapter.setHabits(allHabits);
            adapter.notifyDataSetChanged();
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        System.out.println("Made it here. (onCreateView)");
        return inflater.inflate(R.layout.fragment_habit, container, false);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:backgroundTint="@color/white"
    android:id="@+id/main_layout">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:title="Goal Getter"
        app:titleTextColor="@android:color/white"
        android:layout_alignParentTop="true" />

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/toolbar">

        <!-- This is where your RecyclerView or other content goes -->
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="?attr/actionBarSize" />

    </FrameLayout>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:38:19