我的 fragment_profile.xml 没有显示。我的程序有什么问题?

My fragment_profile.xml doesnt show. Whats wrong with my program?

我创建了一个新片段 ProfileFragment.java 并且还创建了 fragment_profile.xml。 该程序没有给出任何错误,但我的布局没有显示。怎么了?

我的 ProfileFragment.java :


import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;

public class ProfileFragment extends Fragment {

    //firebase auth
    FirebaseAuth firebaseAuth;
    FirebaseUser user;
    FirebaseDatabase firebaseDatabase;
    DatabaseReference databaseReference;

    //layout views
    ImageView avatar;
    TextView nameTxt, emailTxt, phoneTxt;

    public ProfileFragment() {
        //boş public constructor gerekli
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view =  inflater.inflate(R.layout.fragment_profile, container, false);

        //init firebase
        firebaseAuth = FirebaseAuth.getInstance();
        user = firebaseAuth.getCurrentUser();
        firebaseDatabase = FirebaseDatabase.getInstance();
        databaseReference = firebaseDatabase.getReference("Users");


        //init layout views
        avatar = view.findViewById(R.id.avatar);
        nameTxt = view.findViewById(R.id.nameTxt);
        emailTxt = view.findViewById(R.id.emailTxt);
        phoneTxt = view.findViewById(R.id.phoneTxt);

        /* giriş yapan kullanıcıların bilgilerini email yada uid kullanarak çekmek zorundayız
        Kullanıcı detaylarını email adreslerini kullanarak çekicez
        orderbyChild query kullanarak giriş yapılan email ile email key ini eşleştirerek kullanıcı detaylarına ulaşılıyor
         */
        Query query = databaseReference.orderByChild("email").equalTo(user.getEmail());
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                //gerekli veriler gelene kadar kontrol et
                for (DataSnapshot ds: snapshot.getChildren()){
                    //verileri almak için
                    String name = ""+ ds.child("name").getValue();
                    String email = ""+ ds.child("email").getValue();
                    String phone = ""+ ds.child("phone").getValue();
                    String image = ""+ ds.child("image").getValue();

                    //set data
                    nameTxt.setText(name);
                    emailTxt.setText(email);
                    phoneTxt.setText(phone);

                    try {
                        // resim alınırsa ayarla
                        Picasso.get().load(image).into(avatar);
                    } catch (Exception e){
                        // resim alınırken herangi bir sıkıntı varsa varsayılan olarak ayarla
                        Picasso.get().load(R.drawable.add_photo_foreground).into(avatar);
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

        return view;
    }
}

和我的 fragment_profile.xml :

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#F1EDED"
    tools:context=".ProfileFragment">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="180dp"
            android:background="#2ECC71">
            
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="120dp"
                android:orientation="horizontal"
                android:layout_marginTop="100dp">

                <ImageView
                    android:id="@+id/avatar"
                    android:layout_width="120dp"
                    android:layout_height="120dp"
                    android:src="@drawable/add_photo_foreground"
                    android:layout_marginStart="20dp"
                    android:background="#6AE493"
                    android:padding="5dp">
                </ImageView>
                
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">

                    <TextView
                        android:id="@+id/nameTxt"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="5dp"
                        android:layout_marginStart="5dp"
                        android:layout_marginLeft="5dp"
                        android:textSize="25dp"
                        android:textColor="#FFFFFF"></TextView>

                    <TextView
                        android:id="@+id/emailTxt"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="5dp"
                        android:layout_marginLeft="5dp"
                        android:textColor="#FFFFFF"></TextView>

                    <TextView
                        android:id="@+id/phoneTxt"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="5dp"
                        android:layout_marginLeft="5dp"
                        android:textColor="#FFFFFF"></TextView>

                </LinearLayout>


            </LinearLayout>


        </RelativeLayout>
    </RelativeLayout>


</ScrollView>

我想使用 firebase 实时数据库创建一个用户个人资料页面。用户详细信息来自使用当前签名用户的电子邮件。但是我的配置文件布局文件不起作用。我该如何解决这个问题?我的代码有什么问题?

我的DasboardAvtivity.java -> 碎片交易

package com.gamze.pawsbook;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

public class DashboardActivity extends AppCompatActivity {

    //FirebaseAuth
    FirebaseAuth firebaseAuth;

    //Actionbar
    ActionBar actionBar;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dashboard);

        //ActionBar ve başlığı
        actionBar = getSupportActionBar();
        actionBar.setTitle("Profile");

        //profileTxt = findViewById(R.id.profileTxt);

        firebaseAuth = FirebaseAuth.getInstance();


        //Bottom navigation
        BottomNavigationView navigationView = findViewById(R.id.navigation);
        navigationView.setOnNavigationItemSelectedListener(selectedListener);

        //Home Fragment'ı boş default fragment olarak ayarlanması
        actionBar.setTitle("Home"); //ActionBar başlığını değiştirme
        HomeFragment homeFragment = new HomeFragment();
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.content, homeFragment, "");
        ft.commit();

    }

    private BottomNavigationView.OnNavigationItemSelectedListener selectedListener =
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    //itemlere tıklanma özelliği ekleme
                    switch (item.getItemId()){
                        case R.id.action_home:
                            //home fragment değişimi
                            actionBar.setTitle("Home"); //ActionBar başlığını değiştirme
                            HomeFragment homeFragment = new HomeFragment();
                            FragmentTransaction ftHome = getSupportFragmentManager().beginTransaction();
                            ftHome.replace(R.id.content, homeFragment, "");
                            ftHome.commit();

                            return true;
                        case R.id.action_map:
                            //map fragment değişimi
                            actionBar.setTitle("Map"); //ActionBar başlığını değiştirme
                            MapFragment mapFragment = new MapFragment();
                            FragmentTransaction ftMap = getSupportFragmentManager().beginTransaction();
                            ftMap.replace(R.id.content, mapFragment, "");
                            ftMap.commit();
                            return true;
                        case R.id.action_users:
                            //users fragment değişimi
                            actionBar.setTitle("Users"); //ActionBar başlığını değiştirme
                            UsersFragment usersFragment = new UsersFragment();
                            FragmentTransaction ftUsers = getSupportFragmentManager().beginTransaction();
                            ftUsers.replace(R.id.content, usersFragment, "");
                            ftUsers.commit();
                            return true;
                        case R.id.action_profile:
                            //profile fragment değişimi
                            actionBar.setTitle("Profile"); //ActionBar başlığını değiştirme
                            ProfileFragment profileFragment = new ProfileFragment();
                            FragmentTransaction ftProfile = getSupportFragmentManager().beginTransaction();
                            ftProfile.replace(R.id.content, profileFragment, "");
                            ftProfile.commit();
                            return true;
                    }
                    return false;
                }
            };

    private void checkUserStatus() {

        //mevcut kullanıcıyı al
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user != null){
            //kullanıcı giriş yapmışsa burada kal
            //giriş yapan kullanıcının email i
            //profileTxt.setText(user.getEmail());
        }
        else{
            //kullanıcı giriş yapmamışsa main activity'e git
            Intent intent = new Intent(DashboardActivity.this, MainActivity.class);
            startActivity(intent);
            finish();
        }
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        finish();
    }

    @Override
    protected void onStart() {
        //uygulamanın başlangıcını konrtol et
        checkUserStatus();
        super.onStart();
    }


    //options menu dahil etme
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //menuyu dahil etme
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    //menu itemlerine onClick özelliği aktifleştirme

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        //itemlerin id'lerini al
        int id = item.getItemId();
        if (id == R.id.action_logout){
            //hesaptan çıkış yap
            firebaseAuth.signOut();
            checkUserStatus();
        }
        return super.onOptionsItemSelected(item);
    }
}

activity_dashboard.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=".DashboardActivity">

//FrameLayout fragmentlerin üstüste gelebilmesi için daha kullanışlıdır
    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="0dp">
    </FrameLayout>

    //BottomNavigationBar
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="false"
        android:layout_alignParentBottom="true"
        android:background="?android:attr/windowBackground"
        app:menu="@menu/bottombar_menu">
    </com.google.android.material.bottomnavigation.BottomNavigationView>





</RelativeLayout>

这是 fragment_profile.xml 显示的内容。

你的问题没有给出你是像上面那样得到一个空视图还是没有得到任何视图的信息。我将尝试回答两个假设。

  1. 空视图
  2. 完全没有观看

空视图

如果您得到的是空视图,那么您必须在数据库响应中添加一些 Logs 语句,检查该数据库是否正在返回一些值。

public class ProfileFragment extends Fragment {

    //Log Statment
    private static final String TAG = "ProfileFragment";
    
    ......

query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                //gerekli veriler gelene kadar kontrol et
                for (DataSnapshot ds: snapshot.getChildren()){
                    //verileri almak için
                    String name = ""+ ds.child("name").getValue();
                    String email = ""+ ds.child("email").getValue();
                    String phone = ""+ ds.child("phone").getValue();
                    String image = ""+ ds.child("image").getValue();

                    //set data
                    nameTxt.setText(name);
                    emailTxt.setText(email);
                    phoneTxt.setText(phone);
                    Log.d(TAG, "onDataChange: \nName: "+name+" email: "+ email);

                    try {
                        // resim alınırsa ayarla
                        Picasso.get().load(image).into(avatar);
                    } catch (Exception e){
                        // resim alınırken herangi bir sıkıntı varsa varsayılan olarak ayarla
                        Picasso.get().load(R.drawable.add_photo_foreground).into(avatar);
                    }
                }
                Log.d(TAG, "onDataChange: Data is empty");
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Log.d(TAG, "onCancelled: "+error);
            }
 }
 }
.........

您也可以使用 breakpoints 进一步调查。

完全没有观看

如果 ProileFragment 上的视图没有改变,那么您必须检查您是如何启动 ProfileFragment 的。

getSupportFragmentManager().beginTransaction().replace(R.id.frgment_container, new ProfileFragment()).commit();

如果您正在使用 Navigation Component,请确保您导航到正确的目的地。

我还建议您在 Profile Fragment 下按以下格式构建代码 -

public class ProfileFragment extends Fragment {

    //firebase auth
    ............

    //layout views
    ..............

    public ProfileFragment() {
        //boş public constructor gerekli
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view =  inflater.inflate(R.layout.fragment_profile, container, false);
        return view;
    }

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

        //init firebase
        .................

        //init layout views
        .......................

        /* giriş yapan kullanıcıların bilgilerini email yada uid kullanarak çekmek zorundayız
        Kullanıcı detaylarını email adreslerini kullanarak çekicez
        orderbyChild query kullanarak giriş yapılan email ile email key ini eşleştirerek kullanıcı detaylarına ulaşılıyor
         */
        Query query = databaseReference.orderByChild("email").equalTo(user.getEmail());
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                .................
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                ...............
            }
        });
    }
}

编辑 (activity_dashboard.xml)

尝试以下 activity_dashboard.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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".DashboardActivity">

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="?attr/actionBarSize"/>

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:layout_alignParentEnd="false"
        android:layout_alignParentBottom="true"
        android:background="?android:attr/windowBackground"
        app:menu="@menu/bottombar_menu"/>

</RelativeLayout>

我正在使用 ?attr/actionBarSize,这是 android 的标准操作栏大小。 快乐编码!