我在“设置”菜单中创建了一个允许用户输入其名称的设置。我现在需要知道的是如何显示该名称。除了在nameLabel右侧显示名称外,我几乎完成了所有工作。非常感谢任何帮助。
activity_main.xml中
<RelativeLayout 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" >
<!-- The bill amount -->
<TextView
android:id="@+id/billAmountLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="@string/bill_amount_label"
android:textSize="20sp"
android:textStyle="bold" />
<EditText
android:id="@+id/billAmountEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/billAmountLabel"
android:layout_marginLeft="5dp"
android:layout_toRightOf="@+id/billAmountLabel"
android:ems="8"
android:inputType="numberDecimal"
android:text="@string/bill_amount"
android:textSize="20sp" >
<requestFocus />
</EditText>
<!-- The tip percent -->
<TextView
android:id="@+id/percentLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/billAmountLabel"
android:layout_below="@+id/billAmountLabel"
android:padding="10dp"
android:text="@string/tip_percent_label"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/percentTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/percentLabel"
android:layout_alignLeft="@+id/billAmountEditText"
android:padding="5dp"
android:text="@string/tip_percent"
android:textSize="20sp" />
<Button
android:id="@+id/percentDownButton"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_alignBaseline="@+id/percentTextView"
android:layout_marginLeft="25dp"
android:layout_toRightOf="@+id/percentTextView"
android:text="@string/decrease"
android:textSize="20sp" />
<Button
android:id="@+id/percentUpButton"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_alignBaseline="@+id/percentDownButton"
android:layout_toRightOf="@+id/percentDownButton"
android:text="@string/increase"
android:textSize="20sp" />
<!-- the tip amount -->
<TextView
android:id="@+id/tipLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/percentLabel"
android:layout_below="@+id/percentLabel"
android:padding="10dp"
android:text="@string/tip_amount_label"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tipTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/tipLabel"
android:layout_alignLeft="@id/billAmountEditText"
android:padding="5dp"
android:text="@string/tip_amount"
android:textSize="20sp" />
<!-- the total -->
<TextView
android:id="@+id/totalLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tipLabel"
android:layout_below="@+id/tipLabel"
android:padding="10dp"
android:text="@string/total_amount_label"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/totalTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/totalLabel"
android:layout_alignLeft="@+id/tipTextView"
android:padding="5dp"
android:text="@string/total_amount"
android:textSize="20sp" />
<TextView
android:id="@+id/nameLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/totalLabel"
android:padding="10dp"
android:text="Name"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/nameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/nameLabel"
android:layout_alignLeft="@+id/nameLabel"
android:padding="5dp"
android:text=""
android:textSize="20sp" />
的preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="pref_remember_percent"
android:title="@string/remember_percent_title"
android:summary="@string/remember_percent_summary"
android:defaultValue="true" />
<ListPreference
android:key="pref_rounding"
android:title="@string/rounding_title"
android:summary="@string/rounding_summary"
android:dialogTitle="@string/rounding_title"
android:entries="@array/rounding_keys"
android:entryValues="@array/rounding_values"
android:defaultValue="@string/rounding_default" />
<EditTextPreference
android:defaultValue="Default value"
android:key="pref_name"
android:selectAllOnFocus="true"
android:singleLine="true"
android:text="Enter Name"
android:title="Name" />
</PreferenceScreen>
MainActivity.java
import java.text.NumberFormat;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class TipCalculatorActivity extends Activity
implements OnEditorActionListener, OnClickListener {
// define variables for the widgets
private EditText billAmountEditText;
private TextView percentTextView;
private Button percentUpButton;
private Button percentDownButton;
private TextView tipTextView;
private TextView totalTextView;
private TextView nameTextView;
private TextView username;
// define instance variables that should be saved
private String billAmountString = "";
private float tipPercent = .15f;
private String nameLabel;
// define rounding constants
private final int ROUND_NONE = 0;
private final int ROUND_TIP = 1;
private final int ROUND_TOTAL = 2;
// set up preferences
private SharedPreferences prefs;
private boolean rememberTipPercent = true;
private int rounding = ROUND_NONE;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tip_calculator);
// get references to the widgets
billAmountEditText = (EditText) findViewById(R.id.billAmountEditText);
percentTextView = (TextView) findViewById(R.id.percentTextView);
percentUpButton = (Button) findViewById(R.id.percentUpButton);
percentDownButton = (Button) findViewById(R.id.percentDownButton);
tipTextView = (TextView) findViewById(R.id.tipTextView);
totalTextView = (TextView) findViewById(R.id.totalTextView);
nameTextView = (TextView) findViewById(R.id.nameTextView);
// set the listeners
billAmountEditText.setOnEditorActionListener(this);
percentUpButton.setOnClickListener(this);
percentDownButton.setOnClickListener(this);
// set the default values for the preferences
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
// get default SharedPreferences object
prefs = PreferenceManager.getDefaultSharedPreferences(this);
String username =
PreferenceManager.getDefaultSharedPreferences(this).getString("pref_name",
"No name");
nameTextView.setText(username);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_tip_calculator, menu);
return true;
}
@Override
public void onPause() {
// save the instance variables
Editor editor = prefs.edit();
editor.putString("billAmountString", billAmountString);
editor.putFloat("tipPercent", tipPercent);
editor.commit();
super.onPause();
}
@Override
public void onResume() {
super.onResume();
// get preferences
rememberTipPercent = prefs.getBoolean("pref_remember_percent", true);
rounding = Integer.parseInt(prefs.getString("pref_rounding", "0"));
// get the instance variables
billAmountString = prefs.getString("billAmountString", "");
if (rememberTipPercent) {
tipPercent = prefs.getFloat("tipPercent", 0.15f);
} else {
tipPercent = 0.15f;
}
// set the bill amount on its widget
billAmountEditText.setText(billAmountString);
// calculate and display
calculateAndDisplay();
}
public void calculateAndDisplay() {
// get the bill amount
billAmountString = billAmountEditText.getText().toString();
float billAmount;
if (billAmountString.equals("")) {
billAmount = 0;
}
else {
billAmount = Float.parseFloat(billAmountString);
}
// calculate tip and total
float tipAmount = 0;
float totalAmount = 0;
float tipPercentToDisplay = 0;
if (rounding == ROUND_NONE) {
tipAmount = billAmount * tipPercent;
totalAmount = billAmount + tipAmount;
tipPercentToDisplay = tipPercent;
}
else if (rounding == ROUND_TIP) {
tipAmount = StrictMath.round(billAmount * tipPercent);
totalAmount = billAmount + tipAmount;
tipPercentToDisplay = tipAmount / billAmount;
}
else if (rounding == ROUND_TOTAL) {
float tipNotRounded = billAmount * tipPercent;
totalAmount = StrictMath.round(billAmount + tipNotRounded);
tipAmount = totalAmount - billAmount;
tipPercentToDisplay = tipAmount / billAmount;
}
// display the other results with formatting
NumberFormat currency = NumberFormat.getCurrencyInstance();
tipTextView.setText(currency.format(tipAmount));
totalTextView.setText(currency.format(totalAmount));
NumberFormat percent = NumberFormat.getPercentInstance();
percentTextView.setText(percent.format(tipPercentToDisplay));
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
int keyCode = -1;
if (event != null) {
keyCode = event.getKeyCode();
}
if (actionId == EditorInfo.IME_ACTION_DONE ||
actionId == EditorInfo.IME_ACTION_UNSPECIFIED ||
keyCode == KeyEvent.KEYCODE_DPAD_CENTER ||
keyCode == KeyEvent.KEYCODE_ENTER) {
calculateAndDisplay();
}
return false;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.percentDownButton:
tipPercent = tipPercent - .01f;
calculateAndDisplay();
break;
case R.id.percentUpButton:
tipPercent = tipPercent + .01f;
calculateAndDisplay();
break;
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_settings:
// Toast.makeText(this, "Settings", Toast.LENGTH_SHORT).show();
startActivity(new Intent(getApplicationContext(),
SettingsActivity.class));
return true;
case R.id.menu_about:
// Toast.makeText(this, "About", Toast.LENGTH_SHORT).show();
startActivity(new Intent(getApplicationContext(),
AboutActivity.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
答案 0 :(得分:1)
您可以从EditTextPreference
元素中读取名称的值,如下所示
String username = PreferenceManager.getDefaultSharedPreferences(this).getString("pref_name", "No name");
然后将其显示在TextView
这样的
nameTextView.setText(username);
答案 1 :(得分:1)
当用户更改UI中的值时,您的Preference
会将其值保存在应用的默认SharedPreference
对象中。您可以使用SharedPreference
从任意位置访问默认PreferenceManager
。例如,在MainActivity
onCreate()
:
SharedPreferences sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(this);
为避免经常检查新值,请注册在首选项更改时(例如,由用户)通知的处理程序。在此示例中,活动将自身设置为处理程序:
sharedPreference.registerOnSharedPreferenceChangeListener(this);
因此,您的活动必须实现此界面:
public class MainActivity extends AppCompatActivity
implements SharedPreferences.OnSharedPreferenceChangeListener {
最后,您实施onSharedPreferenceChanged
:
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
String username = sharedPreferences.getString("pref_name", "default");
textView_username.setText(username);
}
"pref_name"
是您在preferences.xml中声明的首选项。
在对设置更改感兴趣的所有活动可能看起来像这样:
public class MainActivity extends AppCompatActivity
implements SharedPreferences.OnSharedPreferenceChangeListener {
TextView textView_username;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView_username = findViewById(R.id.textView_username);
SharedPreferences sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(this);
sharedPreference.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
String username = sharedPreferences.getString("key", "default value");
textView_username.setText(username);
}
}