通过数据绑定替换xml标记中的onClick事件

时间:2017-11-29 11:33:57

标签: android xml data-binding android-databinding

我的问题很简单,但我似乎无法做我想做的事。

所以在我的活动中,我有这种方法。

 public void performButtonClick(View view)
 {
        Log.i("INTRO", "OK");
 }

从xml中定义的按钮单击事件调用,如此

 <Button

               android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="performButtonClick"
                android:text="@string/start"/>

现在我听说这种方法使用反射降低了性能,所以我试图用数据绑定替换onClick事件。

我尝试了各种组合,比如

android:onClick="@{performButtonClick}"

 android:onClick="@{(v) -> performButtonClick(v)}"

android:onClick="@{(v) -> MainActivity::performButtonClick}"

但这些都没有奏效 你能救我一下吗?

1 个答案:

答案 0 :(得分:0)

好的回答我自己的问题。

我是DataBinding的新手,但我不明白为什么我必须使用复制粘贴的解决方案,这些解决方案使用了附件android:onClick="performButtonClick"类,最终得到了比以前更多的样板代码。

我想要的只相当于<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="activity" type="com.example.mydatabinding.MainActivity"/> </data> <LinearLayout xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/bg" android:orientation="vertical"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="@{activity::performButtonClick}" android:text="@string/start"/> </LinearLayout> 所以这是我的解决方案:

activity_main.xml中

public final class MainActivity extends AppCompatActivity
{
    ActivityMainBinding binding;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setActivity(this);
    }

    public void performButtonClick(View view)
    {
        Log.i("INTRO", "OK");
    }
}

MainActivity.java

<?php
session_start();
$target_dir = "uploads/";

$filename = $_FILES['file']['name'];
$filePath = $_FILES['file']['tmp_name'];

$types = array('image/jpeg');

if (in_array($_FILES['file']['type'], $types)) {

$exif = exif_read_data($_FILES['file']['tmp_name']);
if (!empty($exif['Orientation'])) {
$imageResource = imagecreatefromjpeg($filePath); // provided that the                         image is jpeg. Use relevant function otherwise
switch ($exif['Orientation']) {
    case 3:
$image = imagerotate($imageResource, 180, 0);
break;

case 6:
$image = imagerotate($imageResource, -90, 0);
break;

case 8:
$image = imagerotate($imageResource, 90, 0);
break;

default:
$image = $imageResource;
} 
}

imagejpeg($image, 'uploads/'.$filename, 100);
$_SESSION["image"] = $filename;
header("Location: http://perfectprints.org.uk/tool.php");

} else {
if (move_uploaded_file($_FILES['file']['tmp_name'], "uploads/".         $_FILES["file"]['name'])) {
    $_SESSION["image"] = $filename;
    header("Location: http://perfectprints.org.uk/tool.php");
    }
}

?>