【问题标题】:How to call a method from layout with variables如何从带有变量的布局中调用方法
【发布时间】:2015-03-01 20:33:14
【问题描述】:

我可能会以错误的方式解决这个问题 - 应用我从其他 API 所知道的 - 所以,如果是这样,也许你可以为我指明不同的方向。事实是,我似乎找不到任何关于我正在做的事情的例子。我正在尝试从 xml 布局中调用一个方法。我想从各种复选框中调用相同的方法,基本上是单击任何复选框,我想将 isChecked 状态存储在 SharedPreferences 文件中。这是我的xml和java:

    <CheckBox
        android:layout_width="194dp"
        android:layout_height="wrap_content"
        android:text="@string/Chri"
        android:id="@+id/chkbxChristmas"
        android:checked="false"
        android:onClick="savePreferencesData(@string/Chri,@+id/chkbxChristmas)"/>


public void savePreferencesData(String preference,int id) {
    SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = prefs.edit();
    CheckBox cb1 = (CheckBox) findViewById(id);
    editor.putBoolean(preference, cb1.isChecked());

    // Commit the edits!
    editor.commit();

    };

如您所见,我正在尝试传递复选框 ID 和 @string/Chri 字符串值(我将此值用作 SharedPreferences 文件中的标记),因此该方法知道要更新哪个首选项。

是否甚至可以传递变量,是否有更好的方法来识别哪个复选框正在调用该方法?

感谢您的帮助!

只是一个快速更新:由于某种原因,我无法让 Lister 运行......这是我的代码:

public void saveHanuPref(View view) {
    final CheckBox checkBox = ( CheckBox ) findViewById( R.id.chkbxHanukkah );
   checkBox.setOnCheckedChangeListener(new  CompoundButton.OnCheckedChangeListener()
    {

       @Override
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
       {
           if ( isChecked )
           {
               SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0);
              SharedPreferences.Editor editor = prefs.edit();
               editor.putBoolean(getString(R.string.Hanu), checkBox.isChecked());
               editor.commit();
           }
       }
   });
}

从活动 xml 调用这个简单的方法(使用 onClick)确实有效:

  public void saveChriPref(View view) {
    CheckBox checkBox = ( CheckBox ) findViewById( R.id.chkbxChristmas );
    SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putBoolean(getString(R.string.Chri), checkBox.isChecked());
    editor.commit();
  };

再次感谢您的帮助。

【问题讨论】:

    标签: java android xml checkbox sharedpreferences


    【解决方案1】:
    1. 您在按钮的onClick() 方法中声明的方法只能采用一种输入类型——它是持有该按钮的视图。不能指定其他数据。

    2. 也就是说,onCLick中的方法应该只有方法名,没有参数等。

      android:onClick = "savePreferencesData()"

    3. 假设您正在使用Activity 类,这就是该方法的创建方式。

      public void savePreferencesData(View v) { // 做你想做的 }

    4. 您在 xml 文件中声明的方法应该只存在于同一个 Activity 类中。也就是说,其他XML文件中的其他按钮不能重用这个方法。

    有没有更好的方法来识别哪个复选框正在调用 方法?

    试试下面的代码示例:

    YOUR_CHECKBOX_NAME.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if(YOUR_CHECKBOX_NAME.isChecked()) {
                System.out.println("Checked");
            } else {
                System.out.println("Un-Checked");
            }
        }
    });
    

    【讨论】:

    • 如果你有一堆复选框,这似乎会添加很多代码,但听起来就是这样做的。感谢您的详细帖子。
    【解决方案2】:

    正确的方法是设置OnCheckedChangeListener

    CheckBox checkBox = ( CheckBox ) findViewById( R.id.chkbxChristmas );
    checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if ( isChecked )
            {
                // perform logic
            }
    
        }
    });
    

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      相关资源
      最近更新 更多