【问题标题】:Cannot save text from Edittext无法从 Edittext 保存文本
【发布时间】:2014-06-25 17:48:20
【问题描述】:

您好,我已经尝试了几个小时,我想放弃。去过很多教程和在线网站来尝试解决这个问题。我正在尝试将 Edittext 字段中的文本存储到变量中,但我没有任何运气。这是我的xml和java代码

<EditText
    android:id="@+id/emailTxt"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/uc_logo"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/uc_logo"
    android:ems="10"
    android:hint="@string/email_hint"
    android:inputType="textEmailAddress"
    android:textColorHint="#000000"
    android:textStyle="italic" />

<EditText
    android:id="@+id/passTxt"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/emailTxt"
    android:layout_marginTop="14dp"
    android:ems="10"
    android:hint="@string/password_hint"
    android:inputType="textPassword"
    android:textColorHint="#000000"
    android:textStyle="italic" />

代码:

public class MainActivity extends ActionBarActivity {

//variables
/*String login_test_name = "t";
String login_test_pass = "t";
EditText username , pass;*/

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); //Remove action bar from screen
    setContentView(R.layout.activity_main);
    //get EditText field data by id name
    /*username = (EditText)findViewById(R.id.emailTxt);
    pass = (EditText)findViewById(R.id.passTxt);*/

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

//code to change activity with BTN click (to register user)
public void registerUser(View v)
{
    Intent i = new Intent(MainActivity.this, UserRegister.class );
    startActivity(i);
}

// code to change activity (to order menu if username and pass are ture)
public void orderMenu(View v)
{
    //variables
    String login_test_name = "t";
    String login_test_pass = "t";
    EditText username , pass;
    //get EditText field data by id name
    username = (EditText)findViewById(R.id.emailTxt);
    pass = (EditText)findViewById(R.id.passTxt);
    String u = username.getText().toString(); // change EditText type to String type
    String p = pass.getText().toString();

    if (!u.equals(login_test_name) && !p.equals(login_test_pass))
    {
        Toast.makeText(this, "wrong username or password",   Toast.LENGTH_SHORT).show();
        Toast.makeText(this, u, Toast.LENGTH_SHORT).show();
        Toast.makeText(this, p, Toast.LENGTH_SHORT).show();
        Toast.makeText(this, login_test_name, Toast.LENGTH_SHORT).show();
        Toast.makeText(this, login_test_pass, Toast.LENGTH_SHORT).show();
    }
    else
    {
        /*
         * Intent i = new Intent(MainActivity.this, OrderMenu.class );
         * startActivity(i);
         */
        Toast.makeText(this, "logged in", Toast.LENGTH_SHORT).show();
    }
}//end order menu method

【问题讨论】:

  • 你从哪里调用 orderMenu() 方法
  • ops 对不起,我的 xml 中有它....
  • 从edittext得到的u和p的值是多少?
  • 我在两者中都输入了一个“t”来测试它。它每次都会进入 if 部分并告诉我我的通行证或用户名错误。当我使用 toast 从编辑文本字段中查看变量中的内容时,它们是空的

标签: java android xml


【解决方案1】:

正如您在评论中提到的,android:onClick ="orderMenu" 用于您试图从两个 EditText 视图中获取值的每次点击的 xml 中的 EditText 中,这似乎不好,Tyr 这一次.

<EditText
android:id="@+id/email_txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/uc_logo"
android:layout_alignParentLeft="true"
android:layout_below="@+id/uc_logo"
android:ems="10"
android:hint="@string/email_hint"
android:inputType="textEmailAddress"
android:textColorHint="#000000"
android:textStyle="italic" />

<EditText
android:id="@+id/pass_txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/email_txt"
android:layout_marginTop="14dp"
android:ems="10"
android:hint="@string/password_hint"
android:inputType="textPassword"
android:textColorHint="#000000"
android:textStyle="italic" />

代码:

username = (EditText)findViewById(R.id.emailTxt);
pass = (EditText)findViewById(R.id.passTxt);
 String u = username.getText().toString();  
String p = pass.getText().toString();

如果您需要在单击时获取值,请尝试添加一个按钮并为其添加单击侦听器 示例:

Button btn = (Button)findViewByid(R.id.click_btn);
btn.setOnClickListener(new onClickListener{
 username = (EditText)findViewById(R.id.emailTxt);
pass = (EditText)findViewById(R.id.passTxt);
 String u = username.getText().toString();  
String p = pass.getText().toString();
 });

【讨论】:

  • 这有什么不同?
  • 不同的是,他为编辑文本字段添加了点击监听,并且两个编辑文本字段的监听器相同。
  • 我没有看到 OP 正在添加点击监听器
  • 他在评论中解释。
  • 我没看到。 OP 的 cmets 包含一个按钮的 xml,它实际上包含一个 onClick 属性,但 EditText 没有此属性,并且您的 xml 代码似乎与他们的没有任何不同。
【解决方案2】:

orderMenu(View) 似乎设置为点击回调。如果这是有意为之,您应该在 XML 中添加一个按钮并为其赋予属性android:onClick="orderMenu"

另外,不相关的,请记住,您正在快速连续显示多个Toast 消息。这看起来不会像您希望的那样好,即使它只是用于测试目的。我建议构建一个消息字符串,然后一次性显示。

if (!u.equals(login_test_name) && !p.equals(login_test_pass))
{
    StringBuilder errorMessage = new StringBuilder();
    errorMessage.append("wrong username or password\n");
    errorMessage.append(u + "\n");
    errorMessage.append(p + "\n");
    errorMessage.append(login_test_name + "\n");
    errorMessage.append(login_test_pass + "\n");

    Toast.makeText(this, errorMessage.toString(), Toast.LENGTH_LONG).show();
}

您不必使用StringBuilder,您可以根据需要制作字符串。 StringBuilder 只是我的选择。

编辑:根据您对问题的评论,我看到您确实有一个使用 android:onClick 属性的按钮。在布局的顶部,您需要添加属性xmlns:tools="http://schemas.android.com/tools"tools:context="&lt; package &gt;.ClassName"。在这种情况下,包不需要是完全限定的包名。它可以是相对路径名,具体取决于清单中设置的包名。

【讨论】:

  • 感谢您的帮助.. 我的 xml 中有一个带有 onClick 属性的按钮...&lt;Button android:id="@+id/loginBTN" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/passTxt" android:layout_marginTop="16dp" android:text="@string/loginBTN" android:onClick="orderMenu" /&gt; 我认为这应该可以工作
  • @user2852603 再次查看我的回复,我在看到您对您问题的评论后才完成编辑。
  • 我的 xml &lt;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:background="@drawable/background" android:gravity="fill" tools:context="com.ucapp.uppercrustapp.MainActivity$PlaceholderFragment" &gt; 中有这个,我使用 fragment_main.xml 有问题吗?
  • 问题似乎是$PlaceholderFragment。您的 orderMenu 方法在 MainActivity 类中。您的上下文告诉它在PlaceholderFragment 中查找orderMenu。所以,要么orderMenu 需要移动到PlaceholderFragment(如果你实际使用片段,这是我推荐的),或者上下文需要更改为com.ucapp.uppercrustapp.MainActivity
  • 我试图将它移动到片段,现在我得到一个错误...findViewById 错误不能对非静态方法进行静态引用
【解决方案3】:

删除了 fragment_main.xml 和 .java 文件中链接它的文本。这解决了我的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多