Я использовал Firebase auth ui
и Firebase realtime database
с фрагментом внутри tablayout
, имеющим фрагменты, и когда я запускаю приложение, оно ничего не показывает во фрагменте после перехода с auth ui
Пожалуйстапроверьте код аутентификации, чтобы либо я правильно настроил аутентификацию firebase и базу данных в реальном времени.Более того, я запутался, как заставить имя пользователя использовать в чате grpoup базу данных в реальном времени
Я искал в Интернете, но не нашел ничего, связанного с этой проблемой
Это мой фрагментв которой я настроил базу данных в реальном времени, чтобы сделать групповой чат
forum_fragment
public class forum_fragment extends Fragment {
private static final int DEFAULT_MSG_LENGTH_LIMIT = 1000;
private ListView mMessageListView;
private MessageAdapter mMessageAdapter;
private EditText mMessageEditText;
private Button mSendButton;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mMessageDatabaseRefrence;
private ForumAdapter forumAdapter;
private ChildEventListener mChildEventListener;
private FirebaseAuth firebaseAuth;
private FirebaseUser user;
private FirebaseAuth.AuthStateListener authStateListener;
private static String mUsername;
public forum_fragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.forum, container, false);
mMessageListView = (ListView) rootView.findViewById(R.id.messageListView);
mMessageEditText = (EditText) rootView.findViewById(R.id.messageEditText);
mSendButton = (Button) rootView.findViewById(R.id.sendButton);
List<MessageModel> messageModel = new ArrayList<>();
mMessageAdapter = new MessageAdapter(getActivity(),R.layout.item_message,messageModel);
mMessageListView.setAdapter(mMessageAdapter);
mFirebaseDatabase = FirebaseDatabase.getInstance();
mMessageDatabaseRefrence = mFirebaseDatabase.getReference().child("messages");
mMessageEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(s.toString().trim().length()>0){
mSendButton.setEnabled(true);
}else{
mSendButton.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
mMessageEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(DEFAULT_MSG_LENGTH_LIMIT)});
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MessageModel message = new MessageModel(mUsername,mMessageEditText.getText().toString());
mMessageDatabaseRefrence.push().setValue(message);
mMessageEditText.setText("");
}
});
if (user!=null) {
user = firebaseAuth.getCurrentUser();
OnSignedInitialize(user.getDisplayName());
}else {
OnSignedOutInitialized();
}
return rootView;
}
public void attachDatabaseListener(){
if(mChildEventListener==null){
mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
MessageModel messageModel = dataSnapshot.getValue(MessageModel.class);
mMessageAdapter.add(messageModel);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
mMessageDatabaseRefrence.addChildEventListener(mChildEventListener);
}
}
public void detachDatatabaseListener(){
if(mChildEventListener!=null){
mMessageDatabaseRefrence.removeEventListener(mChildEventListener);
mChildEventListener=null;
}
}
public void OnSignedInitialize(String userName) {
mUsername = userName;
attachDatabaseListener();
}
public void OnSignedOutInitialized(){
mUsername = "anonymous";
mMessageAdapter.clear();
detachDatatabaseListener();
}
@Override
public void onPause() {
super.onPause();
detachDatatabaseListener();
mMessageAdapter.clear();
}}
MessageAdapter.java
public MessageAdapter(@NonNull Context context, int resource, @NonNull List<MessageModel> objects) {
super(context, resource, objects);
}
@NonNull
@Override
public View getView(int position,View convertView,@NonNull ViewGroup parent) {
if (convertView == null) {
convertView =((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message, parent, false);
}
MessageModel message = getItem(position);
TextView messageTextView = (TextView) convertView.findViewById(R.id.messageTextView);
TextView authorTextView = (TextView) convertView.findViewById(R.id.nameTextView);
messageTextView.setText(message.getMsgText());
authorTextView.setText(message.getUserName());
return convertView;
}}
forum.xml
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".Forum.forum_fragment">
<ListView
android:id="@+id/messageListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/linearForumLayout"
android:stackFromBottom="true"
android:divider="@android:color/transparent"
android:transcriptMode="alwaysScroll"
tools:listitem="@layout/item_message"/>
<LinearLayout
android:id="@+id/linearForumLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:orientation="horizontal">
<EditText
android:id="@+id/messageEditText"
android:layout_width="20dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1" />
<Button
android:id="@+id/sendButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:enabled="false"
android:text="@string/send_button_label"
tools:background="@android:color/holo_green_dark" />
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final int RC_SIGN_IN = 1 ;
/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link FragmentPagerAdapter} derivative, which will keep every
* loaded fragment in memory. If this becomes too memory intensive, it
* may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
private SectionsPagerAdapter mSectionsPagerAdapter;
/**
* The {@link ViewPager} that will host the section contents.
*/
private static MainActivity mainActivity;
public static MainActivity getMainActivity() {
return mainActivity;
}
private static void setMainActivity(MainActivity mainActivity) {
MainActivity.mainActivity = mainActivity;
}
private ViewPager mViewPager;
private FirebaseAuth mFirebaseAuth;
private FirebaseAuth.AuthStateListener mAuthStateListener;
private MessageAdapter mMessageAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MainActivity.setMainActivity(this);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
mFirebaseAuth = FirebaseAuth.getInstance();
mAuthStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
//User sign in
} else {
//User signed out
startActivityForResult(
AuthUI.getInstance()
.createSignInIntentBuilder()
.setIsSmartLockEnabled(false)
.setAvailableProviders(Arrays.asList(
new AuthUI.IdpConfig.GoogleBuilder().build(),
new AuthUI.IdpConfig.EmailBuilder().build()))
.build(),
RC_SIGN_IN);
}
}
};
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
//noinspection SimplifiableIfStatement
switch (item.getItemId()){
case R.id.action_signout:
AuthUI.getInstance().signOut(this);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a PlaceholderFragment (defined as a static inner class below).
switch (position){
case 0:
learning_fragment learning_fragment = new learning_fragment();
return learning_fragment;
case 1:
forum_fragment forum_fragment = new forum_fragment();
return forum_fragment;
default:
return null;
}
}
@Override
public int getCount() {
// Show 3 total pages.
return 2;
}
}
@Override
protected void onPause() {
super.onPause();
if (mAuthStateListener != null) {
mFirebaseAuth.removeAuthStateListener(mAuthStateListener);
}
}
@Override
protected void onResume() {
super.onResume();
mFirebaseAuth.addAuthStateListener(mAuthStateListener);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==RESULT_OK){
Toast.makeText(this,"singed out",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this,"sign in cancelled",Toast.LENGTH_SHORT).show();
finish();
}
}}
MessageModel.java
public class MessageModel {
private String userName;
private String msgText;
public MessageModel() {
}
public MessageModel(String userName, String msgText) {
this.userName = userName;
this.msgText = msgText;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getMsgText() {
return msgText;
}
public void setMsgText(String msgText) {
this.msgText = msgText;
}}