LayoutInflater不更新TextView

时间:2015-10-20 13:52:40

标签: java android

我正在开发一个具有导航抽屉的应用程序,并且需要用户登录。

到目前为止,我已经完成了整个用户登录/注册工作,并且我已经构建了导航抽屉。

我现在要做的是让导航抽屉上的TextView显示用户的全名和他/她的电子邮件。

我尝试使用LayoutInflater,但TextViews不会改变。

我也尝试将用户信息传递给LogCat并正确显示。

我不知道我的问题在哪里。

这是我的代码:

DrawerActivity.java

public class DrawerActivity extends AppCompatActivity{

    public static String[] userInfo = LoginActivity.userInfo;
...
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.navDrawerTheme);
        setContentView(R.layout.activity_drawer_layout);

        //Declare instances.
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ExpandableListView) findViewById(R.id.left_drawer);
        mNavigationDrawer = (LinearLayout) findViewById(R.id.navigationDrawer);


        LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
        View drawerHeaderView = inflater.inflate(R.layout.drawer_header, null);
        TextView tvFullName = (TextView) drawerHeaderView.findViewById(R.id.name);
        TextView tvEmail = (TextView) drawerHeaderView.findViewById(R.id.email);
        ImageView imgProfile = (ImageView) drawerHeaderView.findViewById(R.id.imgProfile);

        tvFullName.setText(userInfo[0] + " " + userInfo[1]);
        tvEmail.setText(userInfo[2]);
        Log.d("First name", "First name: " + userInfo[0]);
        Log.d("Last name", "Last name: " + userInfo[1]);
        Log.d("Email", "Email: " + userInfo[2]);
...

修改

drawer_header.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="120dp"
android:background="#444444">

<RelativeLayout
    android:id="@+id/userInfoWrapper"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_toEndOf="@+id/imgProfile"
    android:layout_alignParentTop="true">

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:textColor="#ffffff"
        android:singleLine="true"
        android:textSize="14sp"
        android:textStyle="bold"
        android:layout_marginTop="40dp"/>

    <TextView
        android:id="@+id/email"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#ffffff"
        android:singleLine="true"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="10dp"
        android:textSize="14sp"
        android:textStyle="normal"
        android:layout_below="@id/name"/>

</RelativeLayout>

<de.hdodenhof.circleimageview.CircleImageView
    android:layout_width="75dip"
    android:layout_height="75dip"
    android:src="@drawable/ic_face_white_48dp"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="20dp"
    android:id="@+id/imgProfile"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true" />

编辑2

activity_drawer_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- Activity Content-->
<FrameLayout
    android:id="@+id/activity_frame"
    android:layout_height="match_parent"
    android:layout_width="match_parent">
</FrameLayout>

<LinearLayout
    android:id="@+id/navigationDrawer"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_gravity="start"
    android:layout_width="270dp">

    <include
        android:id="@+id/drawer_header"
        layout="@layout/drawer_header" />

    <ExpandableListView
        android:id="@+id/left_drawer"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:groupIndicator="@android:color/transparent"
        android:divider="@android:color/transparent"
        android:background="#444444"/>

</LinearLayout>

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

我认为您不需要使用LayoutInflater,只需尝试这个并让我知道

TextView tvFullName = (TextView)findViewById(R.id.name);
TextView tvEmail = (TextView)findViewById(R.id.email);
ImageView imgProfile = (ImageView)findViewById(R.id.imgProfile);

tvFullName.setText(userInfo[0] + " " + userInfo[1]);
tvEmail.setText(userInfo[2]);

为了澄清它的工作原理,因为它已经在布局中定义,因此您可以直接访问它。如果您想使用定义的布局添加一些视图运行时,则使用LayoutInflater。

答案 1 :(得分:0)

您可以尝试拨打

drawerHeaderView.invalidate();

设置文本后刷新视图,因为布局已经膨胀。

我可能错了,但它可能是你获得LayoutInflater实例的方式的问题。试试

LayoutInflater inflater = LayoutInflater.from(getApplicationContext());

答案 2 :(得分:0)

将膨胀的视图附加到父视图,如下所示:

RelativeLayout userInfoRL = (RelativeLayout)findViewById(R.id.userInfoWrapper);
userInfoRL.addView(drawerHeaderView);
//just in case use the userInfoRL.invalidate();

尝试一下,让我知道它是否有效。