1

Я бы хотел иметь текстовый текст TextView, и когда вы нажимаете/долгое время на нем, текстовое поле должно «отображаться» и разрешать редактирование указанного текста. Когда вы закончите редактирование (включите ключ, предположим), он должен вернуться обратно в текстовое окно с обновленным текстом ...Редактор EditText по запросу

Мне интересно, возможно ли реализовать такой виджет или я должен взломать обходной путь? Советы и предложения очень приветствуются.

Если вам нужно больше понять, что я имею в виду, просто перейдите к вашему, например. (windows) skype и посмотреть сами.

РЕДАКТИРОВАТЬ: Уточнение: я специально прошу виджет или такой, который является текстовым просмотром, пока не будет нажат, а затем преобразуется в edittext, содержащий тот же текст; после редактирования он преобразуется обратно в текстовое представление, представляющее новый измененный текст. То, что я имею в виду под «виджетами по запросу».

Но я в надежде получить что-то лучше, чем

public class Widget { 
    TextView text; 
    EditText edit; 
    String textToRepresent; 
    //... 
} 

ответ

0

Как я уже сказал в четверг ... Юл был довольно близко, но не совсем близко. У него была общая идея, но (теоретически) слишком рано вторглись в код;)

Код TextBoxOnDemand, приведенный ниже, готов к выпуску. Идея аналогична тому, что я хотел избежать в OP и что предложил Yul, но с оптимальной реализацией (например, с помощью ViewSwitcher вместо RelativeLayout)

Я собрал ресурсы, необходимые для этого, в следующих статьях:

Creating custom view from xml

Declaring a custom android UI element using XML

Defining custom attrs

How to pass custom component parameters in java and xml

http://kevindion.com/2011/01/custom-xml-attributes-for-android-widgets/

и решил опубликовать их здесь, потому что официальный Google «обучение» документы бесполезны и являются либо устаревшими (не рекомендуется) или не покрывает то, что мне было нужно. Надеюсь, вы не возражаете, чтобы я заявлял о своей собственной награде, но это решение, которое я хотел (и ожидал, ergo the bounty). Я предполагаю, что код будет делать;)

TextBoxOnDemand.java:

package com.skype.widget; 

import android.content.Context; 
import android.content.res.ColorStateList; 
import android.content.res.TypedArray; 
import android.text.SpannableString; 
import android.text.style.UnderlineSpan; 
import android.text.util.Linkify; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.View.OnFocusChangeListener; 
import android.view.View.OnHoverListener; 
import android.view.View.OnLongClickListener; 
import android.widget.EditText; 
import android.widget.ImageButton; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
import android.widget.TextView.OnEditorActionListener; 
import android.widget.ViewSwitcher; 

import com.skype.ref.R; 
import com.skype.ref.RemoteKeys; 

public class TextBoxOnDemand extends ViewSwitcher implements OnClickListener, OnLongClickListener, OnFocusChangeListener, OnHoverListener, 
     OnEditorActionListener 
{ 
    public static final String LOGTAG   = "TextBoxOnDemand"; 

    private View    btmGuard; 
    private ImageButton   cancel, accept; 
    private EditText   editor; 
    private RelativeLayout  editorLayout; 
    private TextView   face; 
    private String    hint   = new String(); 
    private boolean    inEditMode  = false;     //normally this is in textview mode 
    private boolean    inputReady  = false; 
    private String    ourData   = new String(); 
    private String    prefillData  = new String(); 
    private String    tag    = new String();   //usually tag is empty. 
    private View    topGuard; 
    private int     autoLinkMask;// = Linkify.EMAIL_ADDRESSES; //Linkify.ALL; 
    private ColorStateList  textColor, hintColor = null; 

    public TextBoxOnDemand(Context context) 
    { 
     super(context); 
     build(context); 
     setEditable(false); //init 
    } 

    public TextBoxOnDemand(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     build(context); 
     init(context, attrs); 
     setEditable(false); //init 
    } 

    public String getPrefillData() 
    { 
     return prefillData; 
    } 

    public String getTag() 
    { 
     return tag; 
    } 

    public String getText() 
    { 
     Log.d(LOGTAG, "getText() returning '" + ourData + "'"); 
     return ourData; 
    } 

    public boolean hasPrefillData() 
    { 
     return prefillData.isEmpty(); 
    } 

    public boolean isEditable() 
    { 
     Log.d(LOGTAG, "isEditable() returning " + inEditMode); 
     return inEditMode; 
    } 

    @Override 
    public void onClick(View v) 
    { 
     Log.d(LOGTAG, "onClick(" + v + ")"); 
     if (inEditMode) 
     { 
      if (v.equals(accept)) 
      { 
       if (editor.getEditableText().length() == 0 || editor.getEditableText().length() > 5) 
        ourData = editor.getEditableText().toString(); 

       setEditable(false); 
      } else if (v.equals(cancel)) 
      { 
       setEditable(false); 
      } 
     } 
    } 

    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
    { 
     //  Log.d(LOGTAG, "onEditorAction(" + v + ", " + actionId + ", " + event + ") fired!"); 
     Log.d(LOGTAG, "onEditorAction() fired, inputReady = " + inputReady); 
     if (editor.getEditableText().length() > 0 && editor.getEditableText().length() < (prefillData.length() + 2)) return true; //the user needs to enter something 


     if (inputReady && (event.getKeyCode() == RemoteKeys.ENTER.keycode() || event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) //always is 
     { 
      if (editor.getEditableText().length() > prefillData.length() || editor.getEditableText().length() == 0) 
       ourData = editor.getEditableText().toString(); 

      setEditable(false); 
      return false; 
     } 

     if ((editor.getEditableText().toString().compareToIgnoreCase(ourData) == 0 || editor.getEditableText().toString() 
       .compareToIgnoreCase(prefillData) == 0) 
       && !inputReady) //means we didn't just keep on holding enter 
      return true; 
     else 
      inputReady = true; 

     return true; 
    } 

    @Override 
    public void onFocusChange(View v, boolean hasFocus) 
    { 
     Log.d(LOGTAG, "onFocusChange(" + v + ", " + hasFocus + ")\tinEditMode = " + inEditMode); 
     if (inEditMode) 
     { 
      if (hasFocus && (v.equals(topGuard) || v.equals(btmGuard))) 
      { 
       setEditable(false); 
       requestFocus(); 
      } 

      if (hasFocus && (v.equals(editor) || v.equals(accept) || v.equals(cancel))) 
      { 
       //do nothing, you should be able to browse freely here 
       if (ourData.isEmpty() && editor.getEditableText().length() < prefillData.length()) 
       { 
        Log.d(LOGTAG, "adding prefill, before = " + editor.getEditableText()); 
        editor.setText(""); 
        editor.append(prefillData); 
        Log.d(LOGTAG, "now is = " + editor.getEditableText()); 
       } 
      } 
     } else 
     { 
      String text = (ourData.isEmpty()) ? hint : ourData; 
      ColorStateList color; 
      if (hintColor != null && ourData.isEmpty()) 
       color = hintColor; 
      else 
       color = textColor; 
      face.setTextColor(color); 
      if (hasFocus) 
      { 
       SpannableString ss = new SpannableString(text); 
       ss.setSpan(new UnderlineSpan(), 0, text.length(), 0); 
       face.setText(ss); 
      } else 
       face.setText(text); 
     } 
    } 

    @Override 
    public boolean onHover(View v, MotionEvent event) 
    { 
     //  Log.d(LOGTAG, "onHover()"); 
     String text = (ourData.isEmpty()) ? hint : ourData; 
     ColorStateList color; 
     if (hintColor != null && ourData.isEmpty()) 
      color = hintColor; 
     else 
      color = textColor; 
     face.setTextColor(color); 
     switch (event.getAction()) 
     { 
      case MotionEvent.ACTION_HOVER_ENTER: 
       SpannableString ss = new SpannableString(text); 
       ss.setSpan(new UnderlineSpan(), 0, text.length(), 0); 
       face.setText(ss); 
       break; 
      case MotionEvent.ACTION_HOVER_EXIT: 
       face.setText(text); 
       break; 
     } 
     return true; 
    } 

    @Override 
    public boolean onLongClick(View v) 
    { 
     Log.d(LOGTAG, "onLongClick()\tinEditMode = " + inEditMode); 
     if (!inEditMode) //implies that getDisplayedChild() == 0, meaning the textview 
     { 
      setEditable(true); 
      return true; 
     } else 
      return false; 
    } 

    public void setEditable(boolean value) 
    { 
     Log.d(LOGTAG, "setEditable(" + value + ")"); 
     inEditMode = value; 
     if (inEditMode) 
     { 
      //display the editorLayout 
      face.setOnLongClickListener(null); 
      face.setOnHoverListener(null); 
      face.setOnFocusChangeListener(null); //because of GC. 
      face.setOnClickListener(null); 
      face.setVisibility(View.GONE); 
      setDisplayedChild(1); 
      editorLayout.setVisibility(View.VISIBLE); 
      editor.setOnFocusChangeListener(this); 
      editor.setOnEditorActionListener(this); 
      cancel.setOnClickListener(this); 
      accept.setOnClickListener(this); 
      accept.setOnFocusChangeListener(this); 
      cancel.setOnFocusChangeListener(this); 
     } else 
     { 
      editor.setOnFocusChangeListener(null); 
      editor.setOnEditorActionListener(null); 
      cancel.setOnClickListener(null); 
      accept.setOnClickListener(null); 
      accept.setOnFocusChangeListener(null); 
      cancel.setOnFocusChangeListener(null); 
      editorLayout.setVisibility(View.GONE); 
      setDisplayedChild(0); 
      face.setVisibility(View.VISIBLE); 
      face.setOnLongClickListener(this); 
      face.setOnHoverListener(this); 
      face.setOnFocusChangeListener(this); 
      face.setOnClickListener(this); 
      face.setFocusable(true); 
      face.setFocusableInTouchMode(true); 
     } 
     updateViews(); 
    } 

    @Override 
    public void setNextFocusDownId(int nextFocusDownId) 
    { 
     super.setNextFocusDownId(nextFocusDownId); 
     face.setNextFocusDownId(nextFocusDownId); 
     //  editor.setNextFocusDownId(nextFocusDownId); 
     accept.setNextFocusDownId(nextFocusDownId); 
     cancel.setNextFocusDownId(nextFocusDownId); 
    } 

    @Override 
    public void setNextFocusForwardId(int nextFocusForwardId) 
    { 
     super.setNextFocusForwardId(nextFocusForwardId); 
     face.setNextFocusForwardId(nextFocusForwardId); 
     editor.setNextFocusForwardId(nextFocusForwardId); 
    } 

    @Override 
    public void setNextFocusLeftId(int nextFocusLeftId) 
    { 
     super.setNextFocusLeftId(nextFocusLeftId); 
     face.setNextFocusLeftId(nextFocusLeftId); 
     editor.setNextFocusLeftId(nextFocusLeftId); 
    } 

    @Override 
    public void setNextFocusRightId(int nextFocusRightId) 
    { 
     super.setNextFocusRightId(nextFocusRightId); 
     face.setNextFocusRightId(nextFocusRightId); 
     cancel.setNextFocusRightId(nextFocusRightId); 
    } 

    @Override 
    public void setNextFocusUpId(int nextFocusUpId) 
    { 
     super.setNextFocusUpId(nextFocusUpId); 
     face.setNextFocusUpId(nextFocusUpId); 
     //  editor.setNextFocusUpId(nextFocusUpId); 
     accept.setNextFocusUpId(nextFocusUpId); 
     cancel.setNextFocusUpId(nextFocusUpId); 
    } 

    public void setPrefillData(String prefillData) 
    { 
     this.prefillData = new String(prefillData); 
    } 

    public String setTag() 
    { 
     return tag; 
    } 

    public void setText(String text) 
    { 
     Log.d(LOGTAG, "setText(" + text + ")"); 
     ourData = text; 
     updateViews(); 
    } 

    private void build(Context context) 
    { 
     Log.d(LOGTAG, "build()"); 
     addView(View.inflate(context, R.layout.textboxondemand, null)); 
     setFocusable(true); 
     setFocusableInTouchMode(true); 
     setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); 
     setOnFocusChangeListener(this); 
     setOnLongClickListener(this); 

     face = (TextView) findViewById(R.id.TBOD_textview); 
     editorLayout = (RelativeLayout) findViewById(R.id.TBOD_layout); 
     editor = (EditText) findViewById(R.id.TBOD_edittext); 
     accept = (ImageButton) findViewById(R.id.TBOD_accept); 
     cancel = (ImageButton) findViewById(R.id.TBOD_cancel); 
     topGuard = (View) findViewById(R.id.TBOD_top); 
     btmGuard = (View) findViewById(R.id.TBOD_bottom); 

     face.setFocusable(true); 
     face.setFocusableInTouchMode(true); 

     face.setOnLongClickListener(this); 
     face.setOnHoverListener(this); 
     face.setOnFocusChangeListener(this); 
     face.setOnClickListener(this); 

     editor.setOnFocusChangeListener(this); 
     editor.setOnEditorActionListener(this); 
     editor.setHint(hint); 
     editor.setFocusable(true); 
     editor.setFocusableInTouchMode(true); 

     accept.setOnClickListener(this); 
     accept.setOnFocusChangeListener(this); 
     accept.setFocusable(true); 
     cancel.setFocusable(true); 
     cancel.setOnFocusChangeListener(this); 
     cancel.setOnClickListener(this); 

     topGuard.setFocusable(true); 
     topGuard.setOnFocusChangeListener(this); 
     btmGuard.setFocusable(true); 
     btmGuard.setOnFocusChangeListener(this); 

     editor.setNextFocusRightId(R.id.TBOD_accept); 
     editor.setNextFocusDownId(R.id.TBOD_bottom); 
     editor.setNextFocusUpId(R.id.TBOD_top); 

     accept.setNextFocusLeftId(R.id.TBOD_edittext); 
     accept.setNextFocusRightId(R.id.TBOD_cancel); 
     cancel.setNextFocusLeftId(R.id.TBOD_accept); 
    } 

    private void init(Context context, AttributeSet attrs) 
    { 
     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TextBoxOnDemand); 
     //Use a 
     Log.d(LOGTAG, "init()"); 
     if (a == null) Log.d(LOGTAG, "Did you include 'xmlns:app=\"http://schemas.android.com/apk/res-auto\"' in your root layout?"); 

     final int N = a.getIndexCount(); 
     for (int i = 0; i < N; ++i) 
     { 
      int attr = a.getIndex(i); 
      switch (attr) 
      { 
       case R.styleable.TextBoxOnDemand_android_hint: 
        hint = new String(a.getString(attr)); 
        editor.setHint(a.getString(attr)); 
        break; 
       case R.styleable.TextBoxOnDemand_android_text: 
        ourData = new String(a.getString(attr)); 
        break; 
       case R.styleable.TextBoxOnDemand_android_inputType: 
        int inputType = a.getInt(attr, -1); 
        if (inputType != -1) editor.setInputType(inputType); 
        break; 
       case R.styleable.TextBoxOnDemand_android_textColor: 
        textColor = a.getColorStateList(attr); 
        face.setTextColor(textColor); 
        break; 
       case R.styleable.TextBoxOnDemand_android_linksClickable: 
        face.setLinksClickable(a.getBoolean(attr, true)); 
        break; 
       case R.styleable.TextBoxOnDemand_android_textColorHint: 
        hintColor = a.getColorStateList(attr); 
        break; 
       case R.styleable.TextBoxOnDemand_android_autoLink: 
        autoLinkMask = a.getInt(attr, 0); 
        face.setAutoLinkMask(autoLinkMask); 
        break; 

       default: 
        Log.d(LOGTAG, "Skipping attribute " + attr); 
      } 
     } 

     //Don't forget this 
     a.recycle(); 
    } 

    private void updateViews() 
    { 
     Log.d(LOGTAG, "updateViews()"); 
     //  if (getDisplayedChild() == 0) //first child - textview 
     if (!inEditMode) //first child - textview 
     { 
      if (ourData.isEmpty()) 
      { 
       if (hintColor != null) face.setTextColor(hintColor); 
       face.setText(hint); 
      } else 
      { 
       face.setTextColor(textColor); 
       face.setText(ourData); 
      } 
      face.setFocusable(true); 
      face.setFocusableInTouchMode(true); 
      face.setAutoLinkMask(autoLinkMask); 
     } else 
     { //second child - edittext 
      editor.setFocusable(true); 
      editor.setFocusableInTouchMode(true); 
      if (ourData.startsWith(prefillData) || ourData.length() >= prefillData.length()) 
       editor.setText(""); 
      else 
       editor.setText(prefillData); 

      editor.append(ourData); 
      inputReady = false; 

      editor.requestFocus(); 
     } 
    } 

    public void setAutoLinkMask(LinkifyEnum linkifyEnumConstant) 
    { 
     switch (linkifyEnumConstant) 
     { 
      case ALL: 
       autoLinkMask = Linkify.ALL; 
       break; 
      case EMAIL_ADDRESSES: 
       autoLinkMask = Linkify.EMAIL_ADDRESSES; 
       break; 
      case MAP_ADDRESSES: 
       autoLinkMask = Linkify.MAP_ADDRESSES; 
       break; 
      case PHONE_NUMBERS: 
       autoLinkMask = Linkify.PHONE_NUMBERS; 
       break; 
      case WEB_URLS: 
       autoLinkMask = Linkify.WEB_URLS; 
       break; 

      case NONE: 
      default: 
       autoLinkMask = 0; 
       break; 
     } 
     //set it now 
     face.setAutoLinkMask(autoLinkMask); 
    } 

    public enum LinkifyEnum 
    { 
     ALL, EMAIL_ADDRESSES, MAP_ADDRESSES, PHONE_NUMBERS, WEB_URLS, NONE 
    }; 

} 

Я все еще работаю на некоторые вопросы, связанные с фокус, но это работает, как предполагалось. Когда я использую onFocuslistener 1, вы не можете сфокусироваться от одного TextBox к другому; когда текстовое поле самофокусируемо, я могу сфокусироваться от одного к другому просто отлично, но я не могу взаимодействовать между детьми и поэтому не могу сосредоточиться на типе edittext.

файл XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 

    <TextView 
     android:id="@+id/TBOD_textview" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:autoLink="email" 
     android:focusable="true" 
     android:focusableInTouchMode="true" 
     android:linksClickable="true" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <RelativeLayout 
     android:id="@+id/TBOD_layout" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 

     <EditText 
      android:id="@+id/TBOD_edittext" 
      android:layout_width="300dp" 
      android:layout_height="30dp" 
      android:layout_below="@+id/TBOD_textview" 
      android:focusable="true" 
      android:focusableInTouchMode="true" 
      android:imeOptions="actionDone" 
      android:inputType="none" 
      android:maxLines="1" 
      android:padding="2dp" 
      android:singleLine="true" 
      android:textColor="@android:color/black" 
      android:textSize="14dp" /> 

     <ImageButton 
      android:id="@+id/TBOD_accept" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignTop="@+id/TBOD_edittext" 
      android:layout_marginLeft="15dp" 
      android:layout_toRightOf="@+id/TBOD_edittext" 
      android:background="@drawable/button_accept_selector" /> 

     <ImageButton 
      android:id="@+id/TBOD_cancel" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignTop="@+id/TBOD_edittext" 
      android:layout_marginLeft="5dp" 
      android:layout_toRightOf="@+id/TBOD_accept" 
      android:background="@drawable/button_cancel_selector" /> 

     <View 
      android:id="@+id/TBOD_top" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_alignParentTop="true" 
      android:background="@android:color/transparent" /> 

     <View 
      android:id="@+id/TBOD_bottom" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_alignParentBottom="true" 
      android:background="@android:color/transparent" /> 
    </RelativeLayout> 

</RelativeLayout> 

и, наконец, ATTRS.XML-файл:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <declare-styleable name="TextBoxOnDemand"> 
     <attr name="android:text" /> 
     <attr name="android:inputType" /> 
     <attr name="android:hint" /> 
     <attr name="android:textColor" /> 
     <attr name="android:textColorHint" /> 
     <attr name="android:linksClickable" /> 
     <attr name="android:autoLink" /> 
    </declare-styleable> 

</resources> 

Это, как я использовал его в своем основном XML (после включения требуемого пространства имен надстройки):

<com.shark.widget.TextBoxOnDemand 
    android:id="@+id/profile_email2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/profile_skypename" 
    android:layout_below="@+id/profile_email_placeholder" 
    android:hint="@string/add_email" 
    android:inputType="textEmailAddress" 
    android:textColor="@android:color/white" 
    android:textColorHint="@color/skype_blue" /> 

EDIT: Я отлажен вопросы фокусировки. Оказывается, что дает фокус детям трудно, если вы звоните

setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); 

Какие любопытное средства правовой защиты данного вопроса, но до сих пор не решить. После некоторого времени, когда вы играли с прослушивателем , все еще пытаясь добиться идеального поведения, я бросил полотенце и добавил в него еще две фокусы. Я понял, что не могу отслеживать потерю фокуса только на моем контейнере (из-за того, что он никогда не получает фокуса), но я мог бы также отслеживать идею желания отойти от поля редактирования ... Так что я пошел грязным путем и добавил два невидимые штриховые точки, чтобы сэндвич edittext между ними. Как только они получили фокус, я мог скрыть компонент и обеспечить их переход должным образом.

И вот он, теперь он работает так, как должен. Спасибо всем, кто принимал участие.

EDIT3: окончательная полированная версия, я сбросил пользовательские теги, потому что они просто не работают достаточно надежно. Урок для изучения: если есть что-то для Android, не беспокойтесь, клонируя его.

4

У вас есть несколько различных вариантов здесь.

Сначала вам нужно будет зарегистрировать onClick или onLongClick в TextView, который вы хотите сделать интерактивным. Просто убедитесь, что пользователь знает, что он доступен для подключения.

Затем запустите функцию onClick DialogFragment. Мне нравится создавать шоу-функции. Обратите внимание, что вы можете использовать библиотеки поддержки здесь, чтобы сделать ваше приложение обратно совместимым.

private void showDialog() { 
    MyDialogFragment dialog = new MyDialogFragment(); 
    dialog.show(getSupportFragmentManager(), "dialog"); 
} 

DialogFragment довольно прямолинейный. В вашем onCreateView вы будете раздувать представление, которое вы хотите отобразить пользователю. Вы также можете обернуть его простым AlertDialogBuilder, если вы не хотите идти по обычаю.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle  savedInstanceState) { 
    View view = inflater.inflate(R.layout.your_dialog_layout); 

    mTitleEditText = (TextView) view.findViewById(R.id.title); 
    mTitleEditText.setOnClickListener(this); 

    return view; 
} 

После того, как ваш findViewByIds установил ваш onClickListeners. Последнее, что вам нужно позаботиться, - это вернуть данные в исходный TextView. Вы можете сделать это, создав общедоступный метод в своей деятельности, который вы можете вызвать из своего диалогового окна. Что-то вроде этого

@Override 
    public void onClick(View v) { 
     int clickedId = v.getId(); 

     if (clickedId == mDoneButton.getId()) { 
      MyActivity activity = (MyActivity)getActivity(); 

      mTitle = mTitleEditText.getText().toString(); 
      activity.setText(mTitle); 
      dismiss(); 
     } 
    } 

Я бы рекомендовал использовать DialogFragment, потому что он отлично справится с вашим жизненным циклом. Однако другой вариант должен был бы создать новую активность тематические быть диалог

<activity android:theme="@android:style/Theme.Dialog" /> 

Затем вы можете startActivityForResult отображать ваш диалог, а затем захватить ваши результаты в onActivityResult

+0

Это текстовое изображение не изменяется в editview, просто вызывает диалог при нажатии. Существует много полей для заполнения, многие из которых являются необязательными - наличие большого количества диалогов не является вариантом. – Shark

+0

В следующий раз, пожалуйста, определите свой вопрос немного лучше, чем. «Показать» и «Виджет» довольно открыт для интерпретации. –

+0

Я не согласен, виджет может быть либо визуальным компонентом, либо тупым визуальным компонентом, работающим как служба в фоновом режиме; виджет текстового окна должен сделать его довольно очевидным - «показ» просто означает, что «он» (текстовое поле) не существует всегда (эрго «по требованию»). – Shark

2

Вот мое решение. Я просто даю вам основное. Создайте TextView перед EditText и двумя ButtonOK, Cancel (Вы можете изменить на ImageButton, как Skype). Измените видимость двух видов. Код прост без комментариев. Вы можете добавить некоторую нулевую проверку в соответствии с вашей логикой.

public class CompoundTextView extends RelativeLayout implements OnClickListener { 
private EditText edt; 
private TextView txt; 
RelativeLayout layout; 

public SkypeTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
} 

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 
    edt = (EditText) findViewById(R.id.edt); 
    txt = (TextView) findViewById(R.id.txt_name); 
    layout = (RelativeLayout) findViewById(R.id.layout); 
    Button ok = (Button) findViewById(R.id.ok_btn); 
    Button cancel = (Button) findViewById(R.id.cancel_btn); 
    ok.setOnClickListener(this); 
    cancel.setOnClickListener(this); 
    txt.setOnClickListener(this); 

} 

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
    case R.id.ok_btn: 
     String editString = edt.getText().toString(); 

     txt.setText(editString); 
     layout.setVisibility(View.INVISIBLE); 
     txt.setVisibility(View.VISIBLE); 

     break; 

    case R.id.cancel_btn: 
     layout.setVisibility(View.INVISIBLE); 
     txt.setVisibility(View.VISIBLE); 
     break; 
    case R.id.txt_name: 
     txt.setVisibility(View.INVISIBLE); 
     layout.setVisibility(View.VISIBLE); 

     break; 

    } 

} 

}

Создание XML skypetextview. Вы можете настроить шрифт и фон, чтобы сделать его более красивым.

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TextView 
     android:id="@+id/txt_name" 
     android:layout_width="fill_parent" 
     android:layout_height="100dp" 
     android:textColor="#FFFFFF" 
     android:textSize="14sp" 
     android:background="#ff0000" /> 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="invisible" 
     android:id="@+id/layout" > 

     <EditText 
      android:id="@+id/edt" 
      android:layout_width="270dp" 
      android:layout_height="100dp" /> 

     <Button 
      android:id="@+id/ok_btn" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_toRightOf="@id/edt" 
      android:text="OK" /> 

     <Button 
      android:id="@+id/cancel_btn" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/ok_btn" 
      android:layout_toRightOf="@id/edt" 
      android:text="Cancel" /> 
    </RelativeLayout> 
</RelativeLayout> 

добавить (или включить) этот вид макета вы хотите. Пример:

public class TestActivity extends Activity { 

SkypeTextView test; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    LayoutInflater inflate = getLayoutInflater(); 
    test = (SkypeTextView) inflate.inflate(R.layout.compound_text_view, 
      null); 
    setContentView(test); 
} 

PS: я забыл. Вы должны добавить underline формат для вашего текстового просмотра, чтобы пользователь мог его щелкнуть.

+0

Это не делает диалог. Это просто отображение нового представления, которое вы создали. –

+1

Разве он упоминал диалог? Он просто хочет, чтобы текст в профиле Skype был похож на некоторые поля. –

+0

Да. Я думаю, что «показать» + виджет открыт для интерпретации. –

0

Позвольте a EditText изменить его фон на основе его состояния (редактируемый или замороженный). Установите переключатель фона, который делает это.

Используйте этот селектор XML

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_focused="true" android:drawable="@android:drawable/edit_text"/> 
    <item android:drawable="@android:drawable/screen_background_light_transparent"/> 
</selector> 
Смежные вопросы