我创建了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消息正确获取用户名。正确提取用户名。
如果要添加任何详细信息,请与我们联系。任何帮助将不胜感激。
答案 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
。