在主活动中引用片段EditText内容

时间:2015-05-30 00:19:50

标签: android android-fragments

我正在构建一个Android应用程序,我需要获取用户输入以在配置文件中存储常规设置。其中一个设置是服务器IP地址。

我设计了一个与XML布局文件fragment_serverip.xml相关联的片段布局(单独的ServerIPfragment.java文件),其中包含两个EditText来捕获服务器IP和端口号。还有两个按钮可以保存或取消输入。

保存按钮执行以下操作,并在MainActivity.java中定义saveServerIP功能:

public void saveServerIP(View v) {
    String serverIP = "123.123.123.123";//this works and pops up the Toast msg
    String serverIP etServerIP.getText().toString();// this crashes the app

    if (MyIpMatch.isValidIP(serverIP)) {
        Toast.makeText(getBaseContext(), "IP address is valid!", Toast.LENGTH_LONG).show();
    }else{
        Toast.makeText(getBaseContext(), "IP address is not valid!", Toast.LENGTH_LONG).show();
    }

我在MainActivity.java中构建对EditText的引用,如下所示:

public class MainActivity extends ActionBarActivity {
EditText etServerIP;

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

    // get reference to the views        
    etServerIP = (EditText) findViewById(R.id.fieldServerIP);
}

然后我通过菜单选项进入片段视图,如下所示:

if (id == R.id.action_changeIP) {
        setContentView(R.layout.fragment_serverip);

一旦我更新EditText fieldServerIP并单击Save按钮,如果我使用固定字符串,代码就可以正常工作但我似乎无法获取EditText的内容以在ip验证器中使用它。

ip验证器也在MainActivity文件中

我做错了什么?如何将片段中的EditText内容存储到String变量中,以便将其传递给MainActivity.java中的ip验证器代码?

1 个答案:

答案 0 :(得分:0)

我没有使用听众就让它工作了。不确定这是正确的方法,但它有效...随意评论我实施片段的任何风险......

  1. 右键单击主活动java文件以添加片段(不在我读过的文件夹上)

  2. 在主要活动XML文件

    中输入以下条目

  3. 请注意,如果我没有将片段封装在FrameLayout中,它会崩溃 - 原因可能是java专家很明显,但对于我在Java编码中的新手来说并不明显。

    我没有对步骤1中生成的Java文件进行任何更改

    1. 设计片段的布局

    2. 按如下方式调用片段视图 - 我在MainActivity的菜单选项中执行了该操作:

    3. @覆盖

      public boolean onOptionsItemSelected(MenuItem item) {        
      int id = item.getItemId();
      //noinspection SimplifiableIfStatement
      if (id == R.id.action_settings) {
          return true;
      }
      if (id == R.id.action_changeIP) {
          //
          setContentView(R.layout.fragment_server_setup);
      return true;
      
      1. 我的布局有2个EditText字段和一个“保存”按钮

      2. 在主活动中定义一个saveSettings函数,并将其附加到按钮的onClick事件中,类似于(抱歉无法使代码格式化工作......):

        public void saveServerIP(View v){

        etServerIP =(EditText)findViewById(R.id.fieldServerIP);

        if(MainActivity.MyIpMatch.isValidIP(etServerIP.getText()。toString())){

        Toast.makeText(getBaseContext(),“IP有效!”,Toast.LENGTH_LONG)。show();

        setContentView(R.layout.activity_main);
        

        } else {     Toast.makeText(getBaseContext(),“IP无效!”,Toast.LENGTH_LONG)。show(); } }

      3. 请注意,我首先设置了对EditText的引用,然后在ip验证器中使用该引用,以便能够使用getText()。

        成功,应用程序不会崩溃并弹出Toast消息。这应该意味着我可以做任何我需要做的片段元素。

        我确实有一个问题:一旦我切换回主活动布局,我在那里定义的按钮不再立即工作,即它应该触发的HTTP请求是机器人工作几分钟。如果我重新启动应用程序,它将立即再次运行。知道可能导致这种情况的原因吗?我是否需要添加一些代码才能在视图之间进行干净的切换?