Miguel P.
Miguel P.

Reputation: 1007

Android / Java | Navigation Drawer's TextView .setText not working through SharedPreferences

I have a Fragment that allows the user to change their username that will be displayed in a TextView inside a Navigation Drawer. The Fragment, 'SettingsFragment' is inflated in the MainActivity.

SettingsFragment has an EditText where the user enters their username and a button to apply changes. The Navigation Drawer was created in the MainActivity, so I setup SharedPreferences to send the username over to MainActivity. I then proceeded to change the TextView in the Navigation Drawer with .setText(username), however nothing happens. But when I relaunch the app, the Navigation Drawer's TextView changes to the actual username that the user entered in the EditText.

SettingsFragment.java:

public class SettingsFragment extends Fragment {


public SettingsFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final View view = inflater.inflate(R.layout.fragment_settings, container, false);

    final TextInputEditText teiUserName = view.findViewById(R.id.teiUserName);
    final TextView tvEditTextSub = view.findViewById(R.id.tvEditTextSubstitute);
    Button btnApplyChanges = view.findViewById(R.id.btnApplyChanges);

    btnApplyChanges.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            final String user_name = String.valueOf(teiUserName.getText());

            tvEditTextSub.setText(user_name);

            SharedPreferences.Editor editor = getActivity().getSharedPreferences("myPrefs", MODE_PRIVATE).edit();
            editor.putString("name", user_name);
            editor.apply();

        }
    });

    return view;
}}

SettingsFragment XML:

<FrameLayout 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:padding="10dp"
tools:context="com.miguelpeachey.marketplacesimulator.Fragments.SettingsFragment">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/teiUserName"
        android:layout_width="248dp"
        android:layout_height="wrap_content"
        android:layout_above="@+id/btnApplyChanges"
        android:layout_marginBottom="28dp"
        android:text="User"
        android:textColorHint="#000" />

    <Button
        android:id="@+id/btnApplyChanges"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="28dp"
        android:background="#33993f"
        android:padding="12dp"
        android:text="Apply Changes"
        android:textColor="#FFF" />

</RelativeLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

Fragment fragment;

SharedPreferences sharedPreferences;

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

    Toolbar toolbar = findViewById(R.id.toolbar);
    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    View headerView = navigationView.getHeaderView(0);
    final TextView tvDrawerUsername = headerView.findViewById(R.id.tvDrawerUsername);
    setSupportActionBar(toolbar);

    sharedPreferences = getSharedPreferences("myPrefs", Context.MODE_PRIVATE);

    final String usernameID = sharedPreferences.getString("name", "User");

    if (drawer.isDrawerOpen(GravityCompat.START)) {
        tvDrawerUsername.setText(usernameID);
    }}

There is more code in MainActivity.java but there's no need in including it.


In MainActivity.java, I also tried:

if (drawer.isDrawerOpen(GravityCompat.START)) {
        tvDrawerUsername.setText(usernameID);
    }

But it didn't even change the Navigation Drawer's TextView (tvDrawerUsername) after relaunching the app.


In conclusion, the app won't update tvDrawerUsername straight after the button click, but only after I relaunch the app.

Upvotes: 0

Views: 133

Answers (2)

Zoarder Al Muktadir
Zoarder Al Muktadir

Reputation: 126

Try This one:

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

Fragment fragment;

SharedPreferences sharedPreferences;

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

    sharedPreferences = getSharedPreferences("myPrefs", Context.MODE_PRIVATE);Toolbar toolbar = findViewById(R.id.toolbar);
    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    View headerView = navigationView.getHeaderView(0);
    final TextView tvDrawerUsername = headerView.findViewById(R.id.tvDrawerUsername);

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, null, "navigation_drawer_open", "navigation_drawer_close") {
            public void onDrawerClosed(View view) {
                super.onDrawerClosed(view);
                // Do whatever you want here
            }

            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);

                final String usernameID = sharedPreferences.getString("name", "User");
                tvDrawerUsername.setText(usernameID);
            }
        };
    drawer.addDrawerListener(toggle);
    toggle.syncState();
    setSupportActionBar(toolbar);
}

Upvotes: 1

Benkerroum Mohamed
Benkerroum Mohamed

Reputation: 1936

Try defining an TextView attribute on your SettingsFragment class definition :

public class SettingsFragment extends Fragment {

TextView tv;

public SettingsFragment() {
    // Required empty public constructor
}

Define an setter for this attribute on the same class :

public void setTextView(TextView tv){
    this.tv = tv
}

And from your activity, after initializing your fragment and your textView , pass the textView via the setter you just created :

fragment = new SettingsFragment();
fragment.setTextView(tvDrawerUsername);

Finally add textView.setText(user_name); iniside you onlick() method :

 btnApplyChanges.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final String user_name = String.valueOf(teiUserName.getText());

                tvEditTextSub.setText(user_name);

                SharedPreferences.Editor editor = getActivity().getSharedPreferences("myPrefs", MODE_PRIVATE).edit();
                editor.putString("name", user_name);
                editor.apply();
                textView.setText(user_name);

            }
        });

Hope this helps

Upvotes: 0

Related Questions