diff --git a/res/drawable/ic_action_set.xml b/res/drawable/ic_action_set.xml
deleted file mode 100644
index 533bd31..0000000
--- a/res/drawable/ic_action_set.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--  Copyright (C) 2014-2016 The Dirty Unicorns Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="32.000000dp"
-    android:height="32.000000dp"
-    android:viewportWidth="96.000000"
-    android:viewportHeight="96.000000"
-    android:tint="?android:attr/colorAccent">
-
-    <group
-        android:translateY="96.000000"
-        android:scaleX="0.100000"
-        android:scaleY="-0.100000">
-        <path
-            android:fillColor="#FFFFFFFF"
-            android:strokeWidth="1"
-            android:pathData="M567 562 l-187 -187 -98 98 -98 97 -42 -43 -42 -43 139 -138 138 -138 232 227 c127
-125 231 230 230 234 0 3 -20 23 -43 43 l-42 37 -187 -187z" />
-    </group>
-</vector>
diff --git a/res/layout-land/preference_color_picker.xml b/res/layout-land/preference_color_picker.xml
index c2a6a3b..5168a44 100644
--- a/res/layout-land/preference_color_picker.xml
+++ b/res/layout-land/preference_color_picker.xml
@@ -57,16 +57,11 @@
                 android:id="@+id/hex"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:inputType="text"
+                android:maxLines="1"
+                android:maxLength="7"
                 android:hint="@string/hex_hint" />
 
-            <ImageButton
-                android:id="@+id/enter"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="10dp"
-                android:background="@android:color/transparent"
-                android:gravity="center"
-                android:src="@drawable/ic_action_set" />
         </LinearLayout>
 
         <TextView
diff --git a/res/layout/preference_color_picker.xml b/res/layout/preference_color_picker.xml
index 26dd736..d6f2498 100644
--- a/res/layout/preference_color_picker.xml
+++ b/res/layout/preference_color_picker.xml
@@ -43,17 +43,11 @@
             android:id="@+id/hex"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:inputType="text"
+            android:maxLines="1"
+            android:maxLength="7"
             android:hint="@string/hex_hint" />
 
-        <ImageButton
-            android:id="@+id/enter"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="10dp"
-            android:background="@android:color/transparent"
-            android:gravity="center"
-            android:src="@drawable/ic_action_set" />
-
     </LinearLayout>
 
     <com.bliss.support.colorpicker.ColorPickerView
diff --git a/src/com/bliss/support/colorpicker/ColorPickerDialog.java b/src/com/bliss/support/colorpicker/ColorPickerDialog.java
index 212a22f..03b00d7 100644
--- a/src/com/bliss/support/colorpicker/ColorPickerDialog.java
+++ b/src/com/bliss/support/colorpicker/ColorPickerDialog.java
@@ -26,12 +26,13 @@
 import android.view.View;
 import android.view.Window;
 import android.widget.EditText;
+import android.view.KeyEvent;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
 
 import com.bliss.support.R;
 
-public class ColorPickerDialog extends AlertDialog implements ColorPickerView.OnColorChangedListener, View.OnClickListener {
+public class ColorPickerDialog extends AlertDialog implements ColorPickerView.OnColorChangedListener, View.OnClickListener, View.OnKeyListener {
 
     private ColorPickerView mColorPicker;
     private ColorPickerPanelView mOldColor;
@@ -58,6 +59,15 @@
         }
     }
 
+    private void setColorFromHex() {
+        String text = mHex.getText().toString();
+        try {
+            int newColor = ColorPickerPreference.convertToColorInt(text);
+            mColorPicker.setColor(newColor, true);
+        } catch (Exception ignored) {
+        }
+    }
+
     private void setUp(int color) {
 
         LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(
@@ -71,7 +81,6 @@
         mNewColor = layout.findViewById(R.id.new_color_panel);
 
         mHex = layout.findViewById(R.id.hex);
-        ImageButton mSetButton = layout.findViewById(R.id.enter);
 
         ((LinearLayout) mOldColor.getParent()).setPadding(Math.round(mColorPicker.getDrawingOffset()),
                 0, Math.round(mColorPicker.getDrawingOffset()), 0);
@@ -83,17 +92,8 @@
         mColorPicker.setColor(color, true);
 
         if (mHex != null) {
-            mHex.setText(ColorPickerPreference.convertToARGB(color));
-        }
-        if (mSetButton != null) {
-            mSetButton.setOnClickListener(v -> {
-                String text = mHex.getText().toString();
-                try {
-                    int newColor = ColorPickerPreference.convertToColorInt(text);
-                    mColorPicker.setColor(newColor, true);
-                } catch (Exception ignored) {
-                }
-            });
+            mHex.setText(ColorPickerPreference.convertToRGB(color));
+            mHex.setOnKeyListener(this);
         }
 
         setView(layout);
@@ -105,7 +105,7 @@
         mNewColor.setColor(color);
         try {
             if (mHex != null) {
-                mHex.setText(ColorPickerPreference.convertToARGB(color));
+                mHex.setText(ColorPickerPreference.convertToRGB(color));
             }
         } catch (Exception ignored) {
         }
@@ -129,6 +129,16 @@
     }
 
     @Override
+    public boolean onKey(View v, int keyCode, KeyEvent event) {
+        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
+                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
+            setColorFromHex();
+            return true;
+        }
+        return false;
+    }
+
+    @Override
     public void onClick(View v) {
         if (v.getId() == R.id.new_color_panel) {
             if (mListener != null) {
diff --git a/src/com/bliss/support/colorpicker/ColorPickerPreference.java b/src/com/bliss/support/colorpicker/ColorPickerPreference.java
index 998e6d4..abf6c07 100644
--- a/src/com/bliss/support/colorpicker/ColorPickerPreference.java
+++ b/src/com/bliss/support/colorpicker/ColorPickerPreference.java
@@ -319,6 +319,26 @@
         return "#" + alpha + red + green + blue;
     }
 
+    public static String convertToRGB(int color) {
+        String red = Integer.toHexString(Color.red(color));
+        String green = Integer.toHexString(Color.green(color));
+        String blue = Integer.toHexString(Color.blue(color));
+
+        if (red.length() == 1) {
+            red = "0" + red;
+        }
+
+        if (green.length() == 1) {
+            green = "0" + green;
+        }
+
+        if (blue.length() == 1) {
+            blue = "0" + blue;
+        }
+
+        return "#" + red + green + blue;
+    }
+
     /**
      * For custom purposes. Not used by ColorPickerPreferrence
      *
