2017-09-24 68 views
0
package com.example.demo.myblog; 

import android.content.Context; 
import android.content.Intent; 
import android.support.annotation.NonNull; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.firebase.ui.database.FirebaseRecyclerAdapter; 
import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseUser; 
import com.google.firebase.database.DatabaseReference; 
import com.google.firebase.database.FirebaseDatabase; 
import com.squareup.picasso.Picasso; 

import org.w3c.dom.Text; 

public class MainActivity extends AppCompatActivity { 

    private RecyclerView mReclBlogMainList; //The main recycler view for listing posts 
    private DatabaseReference mDatabaseRef; 
    private FirebaseAuth mAuth; 
    private FirebaseAuth.AuthStateListener mAuthStateListener; 

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

     mAuth = FirebaseAuth.getInstance(); 
     mAuthStateListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       if(firebaseAuth.getCurrentUser() == null){ 
        Toast.makeText(MainActivity.this, "User null", Toast.LENGTH_SHORT).show(); 
//     startActivity(new Intent(MainActivity.this, LoginActivity.class)); 
//     finish(); //can't go back to previous activity # MainActivity 
       } 
      } 
     }; 

     //All our posts reside inside the Blog directory under the database root 
     mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Blog"); 

     //Initialize Recycler View 
     mReclBlogMainList = (RecyclerView)findViewById(R.id.reclBlogMainList); 
     mReclBlogMainList.setHasFixedSize(true); 
     //setting a layout manager for recycler view -- vertical list 
     mReclBlogMainList.setLayoutManager(new LinearLayoutManager(this)); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     //adding auth state listener 
     mAuth.addAuthStateListener(mAuthStateListener); 
     //Creating adapter after creating view holder class below 
     FirebaseRecyclerAdapter<Blog, BlogViewHolder>firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(
       Blog.class, 
       R.layout.blog_row, 
       BlogViewHolder.class, 
       mDatabaseRef 
     ) { 
      @Override 
      protected void populateViewHolder(BlogViewHolder viewHolder, Blog model, int position) { 
       //setting title, desc, image to view holder after fetch from database 
       viewHolder.setTitle(model.getTitle()); 
       viewHolder.setDesc(model.getDesc()); 
       viewHolder.setImage(getApplicationContext(), model.getImage()); //since View holder is static class 
      } 
     }; 
     //setting up recycler view with firebase adapter 
     mReclBlogMainList.setAdapter(firebaseRecyclerAdapter); 
    } 

    //inflate the menu created in the main_menu file 
    // onto the top menu bar of the app 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main_menu, menu); 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     //called when user selects any icon on the inflated menu 
     if(item.getItemId() == R.id.action_add){ 
      // if the user has clicked on the '+' icon 
      startActivity(new Intent(MainActivity.this, PostActivity.class)); 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    //For setting up a recycler view, we need a view holder 
    //Creating view holder after setting up Blog class 
    public static class BlogViewHolder extends RecyclerView.ViewHolder{ 
     View mView; 
     public BlogViewHolder(View itemView) { 
      super(itemView); 

      mView = itemView; 
     } 

     //Set the title and desc for the recycler view posts 
     public void setTitle(String title){ 
      TextView postTitle = (TextView)mView.findViewById(R.id.txtPostTitle); 
      postTitle.setText(title); 
     } 
     public void setDesc(String desc){ 
      TextView postDesc = (TextView)mView.findViewById(R.id.txtPostDesc); 
      postDesc.setText(desc); 
     } 
     //as it's inside a static class 
     public void setImage(Context ctx, String imageUrl){ 
      ImageView postImage = (ImageView)mView.findViewById(R.id.imgPostImage); 

      //with the application context, load the image from 
      //the file url into the image view 
      Picasso.with(ctx).load(imageUrl).into(postImage); 
     } 
    } 
} 

这是一个简单的博客应用的主页。我正在尝试使用OnCreate函数中的AuthStateListener来检查用户是否登录。但是,当我启动应用程序时,它永远不会被调用。应用在检查用户登录时不断崩溃Firebase

此外,当我加入AUTH状态侦听器,以火力AUTH例如在OnStart功能,在劳克我的应用程序崩溃。

我在做什么错?我如何检查用户登录?

我正在使用Google登录进行Firebase。

我收到以下错误。

了java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.demo.myblog/com.example.demo.myblog.LoginActivity}:java.lang.IllegalStateException:您需要使用一个主题。 AppCompat主题(或后代)与此活动。

+0

你能证明你错误 – Salman500

+0

当我刚启动应用程序,它只是崩溃。我给出了一个通用的错误,如未能加载应用程序。 –

+0

您需要检查logcat的输出日志,不只是弹出窗口在屏幕上...... – csmckelvey

回答

0

的问题是在此错误路线:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.demo.myblog/com.example.demo.myblog.LoginActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. 

您需要t o使用Theme.AppCompat为MainActivity主题AndroidManifest.xml

您需要使用的主题从res/style.xml这样的:

<resources> 

    <!-- Base application theme. --> 
    <style name="AppTheme" parent="Theme.AppCompat"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 
    </style> 

</resources> 

事情是这样的:

<activity 
    android:name=".MainActivity" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"/> 
+0

非常感谢你的帮助。 –

+0

非常欢迎;) –

0

请初始化FirebaseUser的对象onCreate方法中像下面 -

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 

,并在活动的OnStart方法只检查

if (user != null) { 
     // Your user is authenticated 
     // Do your tasks; 
     }