【问题标题】:Android / Java | Navigation Drawer's TextView .setText not working through SharedPreferences安卓/Java | Navigation Drawer 的 TextView .setText 无法通过 SharedPreferences 工作
【发布时间】:2018-12-21 10:32:21
【问题描述】:

我有一个片段,允许用户更改他们的用户名,该用户名将显示在导航抽屉内的 TextView 中。片段“SettingsFragment”在 MainActivity 中膨胀。

SettingsFragment 有一个 EditText,用户可以在其中输入他们的用户名和一个按钮来应用更改。 Navigation Drawer 是在 MainActivity 中创建的,因此我设置了 SharedPreferences 以将用户名发送到 MainActivity。然后我继续使用.setText(username) 更改导航抽屉中的TextView,但是没有任何反应。 但是当我重新启动应用程序时,导航抽屉的 TextView 会更改为用户在 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);
    }}

MainActivity.java 中有更多代码,但不需要包含它。


在MainActivity.java中,我也试过:

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

但在重新启动应用后,它甚至没有更改 Navigation Drawer 的 TextView (tvDrawerUsername)。


总之,该应用不会在单击按钮后立即更新 tvDrawerUsername,而只会在我重新启动应用后更新。

【问题讨论】:

    标签: java android textview sharedpreferences navigation-drawer


    【解决方案1】:

    试试这个:

    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);
    }
    

    【讨论】:

    • 添加了 'sharedPreferences = getSharedPreferences("myPrefs", Context.MODE_PRIVATE);'在 onDrawerOpened 中,它可以工作。
    【解决方案2】:

    尝试在 SettingsFragment 类定义上定义 TextView 属性:

    public class SettingsFragment extends Fragment {
    
    TextView tv;
    
    public SettingsFragment() {
        // Required empty public constructor
    }
    

    在同一个类上为这个属性定义一个setter:

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

    从您的活动中,在初始化您的 fragment 和您的 textView 之后,通过您刚刚创建的设置器传递 textView

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

    最后添加textView.setText(user_name); iniside you onlick() 方法:

     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);
    
                }
            });
    

    希望对你有帮助

    【讨论】:

    • 'textView' 是 Navigation Drawer 的 TextView 吗?当我使用 textView.setText(user_name); 运行应用程序时它给了我一个 NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on an null object reference at com.miguelpeachey.marketplacesimulator.Fragments.SettingsFragment$1.onClick(SettingsFragment.java :53)
    • 是的,但是应该在TextView tvDrawerUsername = headerView.findViewById(R.id.tvDrawerUsername)之后使用fragment.setTextView(tvDrawerUsername);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多