Мой fragment_profile. xml не отображается. Что не так с моей программой? - PullRequest
0 голосов
/ 07 августа 2020

Я создал новый фрагмент ProfileFragment. java, а также создал fragment_profile. xml. Программа не выдает ошибок, но мой макет не отображается. Что не так?

My 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 в реальном времени. Данные пользователя поступают из электронной почты для текущего подписанного пользователя. Но мой файл макета профиля не работает. Как я могу исправить эту проблему? Что не так в моем коде?

My 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>

1 Ответ

0 голосов
/ 07 августа 2020

Это то, что отображается из fragment_profile.xml.

enter image description here

Your question doesn't give information whether you are getting an empty view like above or you are not getting any view. I will try to answer on two ansumption.

  1. Empty View
  2. No View at all

Empty View

If you are getting empty view then you must put some Logs statement in your database responce, check if that database is returning some value.

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);
            }
 }
 }
.........

You can use точки останова , а также для дальнейшего исследования.

Нет просмотра вообще

Если представление в ProileFragment не меняется, вы должны проверить, как вы запускаете ProfileFragment.

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

Если вы используете Navigation Component , убедитесь, что вы переход к правильному пункту назначения.

Я также предлагаю вам структурировать код в следующем формате в разделе «Фрагмент профиля» -

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) {
                ...............
            }
        });
    }
}

Edit (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. Удачного кодирования!

...