在Navigation抽屉标题上显示用户名和用户电子邮件

时间:2016-02-18 09:42:17

标签: android sqlite android-layout drawerlayout android-navigation-drawer

我创建了BaseActivity来显示所有活动的导航抽屉。需要extends导航BaseActivity的活动。

我尝试更改导航抽屉中textviews的值以显示用户名和用户电子邮件。但我得到NullPointerException如下。

  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
  at com.mysite.myapp.MainActivity.onCreate(BaseActivity.java:100)
  at com.mysite.myapp.ActivityMain.onCreate(ActivityMain.java:22)

nav_header.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/nav_header_height"
    android:background="@drawable/side_nav_bar"
    android:gravity="bottom"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:theme="@style/ThemeOverlay.AppCompat.Dark">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:src="@android:drawable/sym_def_app_icon" />

    <TextView
        android:id="@+id/userView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
      android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

    <TextView
        android:id="@+id/EmailView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

BaseActivity.java

public abstract class BaseActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {
    private SQLiteHandler db;
    private SessionManager session;
    private Toolbar mActionBarToolbar;
    private DrawerLayout mDrawerLayout;
    protected NavigationView mNavigationView;
    private ActionBarDrawerToggle mToggle;
    private TextView txtName;
    private TextView txtEmail;


    protected boolean useToolbar() {
        return true;
    }


    protected boolean useDrawerToggle() {
        return true;
    }


    @Override
    public void setContentView(int layoutResID) {
        super.setContentView(layoutResID);

        getActionBarToolbar();

        setupNavDrawer();
    }//end setContentView


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


        txtEmail = (TextView) findViewById(R.id.EmailView);
        txtName = (TextView) findViewById(R.id.userView);
        db = new SQLiteHandler(getApplicationContext());

        // session manager
        session = new SessionManager(getApplicationContext());

        if (!session.isLoggedIn()) {
            session.setLogin(false);

            db.deleteUsers();

            // Launching the login activity
            Intent intent = new Intent(this, LoginActivity.class);
            startActivity(intent);
            // finish();
        }

        // Fetching user details from sqlite
        HashMap<String, String> user = db.getUserDetails();

        String name = user.get("name");
        String email = user.get("email");
        //Toast Message to show the usernmae
        Toast.makeText(getApplicationContext(), name, Toast.LENGTH_LONG).show();

         txtName.setText(name);
         txtEmail.setText(email);

    }}

更多细节 作为基本活动,我在用户登录后使用它来创建用户会话。我从SQLite数据库中获取用户名和用户电子邮件。我还尝试测试是否通过代码中指示的Toast消息正确获取用户名。正确提取用户名。

如果要添加任何详细信息,请与我们联系。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您永远不会将布局设置为活动。

在致电setContentView(R.layout.activity_layout)后,在onCreate中使用super

您的onCreate方法应如下所示

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_layout); // use your layout

    txtEmail = (TextView) findViewById(R.id.EmailView);
    ...
    ...
}

注意:如果您未使用setContentView设置布局,则表示您没有与该活动相关联的任何布局,并且如果您尝试使用{ {1}}获取任何视图,然后它将为null。

<强>更新

请记住,您正在使用它作为其他活动的基类,您应该有一个布局,它将容纳这两个TextView和一个容器。在基类中使用该布局。当子类调用findViewById时,只需加载从子类传递到该容器的布局。这样您就可以在所有活动中使用这些视图。

答案 1 :(得分:1)

您必须使用setContentView方法拨打onCreate