android-edittext example - Entwerfen Sie Android EditText, um eine Fehlermeldung wie von Google beschrieben anzuzeigen




input type (5)

Ich brauche einen EditText , der so aussieht onError:

Das Aufrufen von onError sieht stattdessen so aus:

Hinweis: Die App läuft auf SDK 19 (4.4.2)

min SDK ist 1

Gibt es eine ähnliche Methode wie setError, die das automatisch macht, oder muss ich den Code dafür schreiben?

Vielen Dank


Answers

ReVerse's Antwort ist großartig, aber es hat nicht darauf hingewiesen, wie man den Floating Error Tooltip irgendwie entfernt

Sie benötigen edittext.setError(null) , um das zu entfernen.
Wie bereits erwähnt, benötigen Sie nicht TextInputLayout.setErrorEnabled(true)

Layout

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter something" />
</android.support.design.widget.TextInputLayout>

Code

TextInputLayout til = (TextInputLayout) editText.getParent();
til.setError("Your input is not valid...");
editText.setError(null);

Sie müssen keine Bibliothek eines Drittanbieters verwenden, da Google das TextInputLayout als Teil der design-support-library .

Nach einem grundlegenden Beispiel:

Layout

<android.support.design.widget.TextInputLayout
    android:id="@+id/text_input_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:errorEnabled="true">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your name" />

</android.support.design.widget.TextInputLayout>

Hinweis: Wenn Sie app:errorEnabled="true" als Attribut von TextInputLayout , wird die Größe nicht geändert, sobald ein Fehler angezeigt wird. Der Block wird also im Wesentlichen blockiert.

Code

Um den Fehler unter dem EditText Sie einfach #setError auf dem TextInputLayout (NICHT auf dem Kind- EditText ) EditText :

TextInputLayout til = (TextInputLayout) findViewById(R.id.text_input_layout);
til.setError("You need to enter a name");

Ergebnis

Um den Fehler zu verbergen und den Farbton zurückzusetzen, rufen til.setError(null) einfach til.setError(null) .

Hinweis

Um das TextInputLayout zu verwenden, TextInputLayout Sie Ihren build.gradle Abhängigkeiten folgendes build.gradle :

dependencies {
    compile 'com.android.support:design:25.1.0'
}

Festlegen einer benutzerdefinierten Farbe

Standardmäßig ist die Zeile des EditText rot. Wenn Sie eine andere Farbe anzeigen müssen, können Sie den folgenden Code verwenden, sobald Sie setError .

editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);

Um es zu löschen, rufen Sie einfach die folgende Zeile auf:

editText.getBackground().clearColorFilter;

TextInputLayout til = (TextInputLayout)editText.getParent();
til.setErrorEnabled(true);
til.setError("some error..");

Rufen Sie myTextInputLayout.setError() anstelle von myEditText.setError() .

Diese Container und Containments haben eine doppelte Funktionalität bei Einstellungsfehlern. Die Funktionalität, die Sie brauchen, ist die eines Containers. Dafür könntest du eine minimale Version von 23 verlangen.


Ich habe AsyncTask Klasse geändert, um die Erstellung von progressDialog im selben Kontext zu behandeln. Ich denke, dass der folgende Code wiederverwendbar sein wird. (es kann von jeder Aktivität aufgerufen werden, übergeben Sie einfach Kontext, Zieldatei, Dialognachricht)

public static class DownloadTask extends AsyncTask<String, Integer, String> {
    private ProgressDialog mPDialog;
    private Context mContext;
    private PowerManager.WakeLock mWakeLock;
    private File mTargetFile;
    //Constructor parameters :
    // @context (current Activity)
    // @targetFile (File object to write,it will be overwritten if exist)
    // @dialogMessage (message of the ProgresDialog)
    public DownloadTask(Context context,File targetFile,String dialogMessage) {
        this.mContext = context;
        this.mTargetFile = targetFile;
        mPDialog = new ProgressDialog(context);

        mPDialog.setMessage(dialogMessage);
        mPDialog.setIndeterminate(true);
        mPDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mPDialog.setCancelable(true);
        // reference to instance to use inside listener
        final DownloadTask me = this;
        mPDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                me.cancel(true);
            }
        });
        Log.i("DownloadTask","Constructor done");
    }

    @Override
    protected String doInBackground(String... sUrl) {
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            // expect HTTP 200 OK, so we don't mistakenly save error report
            // instead of the file
            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            }
            Log.i("DownloadTask","Response " + connection.getResponseCode());

            // this will be useful to display download percentage
            // might be -1: server did not report the length
            int fileLength = connection.getContentLength();

            // download the file
            input = connection.getInputStream();
            output = new FileOutputStream(mTargetFile,false);

            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                // allow canceling with back button
                if (isCancelled()) {
                    Log.i("DownloadTask","Cancelled");
                    input.close();
                    return null;
                }
                total += count;
                // publishing the progress....
                if (fileLength > 0) // only if total length is known
                    publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);
            }
        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return null;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // take CPU lock to prevent CPU from going off if the user
        // presses the power button during download
        PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                getClass().getName());
        mWakeLock.acquire();

        mPDialog.show();

    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        // if we get here, length is known, now set indeterminate to false
        mPDialog.setIndeterminate(false);
        mPDialog.setMax(100);
        mPDialog.setProgress(progress[0]);

    }

    @Override
    protected void onPostExecute(String result) {
        Log.i("DownloadTask", "Work Done! PostExecute");
        mWakeLock.release();
        mPDialog.dismiss();
        if (result != null)
            Toast.makeText(mContext,"Download error: "+result, Toast.LENGTH_LONG).show();
        else
            Toast.makeText(mContext,"File Downloaded", Toast.LENGTH_SHORT).show();
    }
}




android android-edittext