【问题标题】:EditTextPreference With Button带按钮的 EditTextPreference
【发布时间】:2012-07-01 23:56:58
【问题描述】:

我想在 android edittextpreference 上放一个按钮。 我创建了一个自定义的editextpreference:

public class EditTextPreferenceWithButton extends EditTextPreference {

    private Context context;

    public EditTextPreferenceWithButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.context=context;
      }

      public EditTextPreferenceWithButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context=context;
      }

      public EditTextPreferenceWithButton(Context context) {
        super(context);
        this.context=context;
      }



      @Override
        protected void onBindDialogView(View view) {
            super.onBindDialogView(view);



           view.setLayoutParams(new LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));



            final EditText editText = (EditText)view.findViewById(android.R.id.edit);
            ViewGroup vg = (ViewGroup)editText.getParent();

            Button button = new Button(context);


            vg.addView(button,ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT);


        }
}

通过这种方式,按钮显示在编辑文本下方,但我希望它是下一个编辑文本,如下所示:

|编辑文本| |按钮|

请帮帮我! 谢谢

【问题讨论】:

  • 您想要一个带有右侧按钮的编辑文本,以便将它们添加到对话框中?
  • 是的。在单击 edittextpreference 行时显示的对话框中。
  • 看我的回答,这就是你要找的吗?

标签: android android-edittext


【解决方案1】:

我会创建一个DialogPreference 的子类。

class EditTextDialogPreference extends DialogPreference {

    //Layout Fields
    private final LinearLayout layout = new LinearLayout(this.getContext());
    private final EditText editText = new EditText(this.getContext());
    private final Button button = new Button(this.getContext());


    //Called when addPreferencesFromResource() is called. Initializes basic paramaters
    public EditTextDialogPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        setPersistent(true);
        button.setText("Button");
        layout.setOrientation(LinearLayout.HORIZONTAL);
    }

    //Create the Dialog view
    @Override
    protected View onCreateDialogView() {
        layout.addView(editText);
        layout.addView(button);
        return parentLayout;
    }

    //Attach persisted values to Dialog
    @Override
    protected void onBindDialogView(View view) {
        super.onBindDialogView(view);
        editText.setText(getPersistedString("EditText"), TextView.BufferType.NORMAL);
    }

    //persist values and disassemble views
    @Override
    protected void onDialogClosed(boolean positiveresult) {
        super.onDialogClosed(positiveresult);
        if (positiveresult && shouldPersist()) {
            persistString(editText.getText().toString());
        }

        ((ViewGroup) editText.getParent()).removeView(editText);
        ((ViewGroup) button.getParent()).removeView(button);
        ((ViewGroup) layout.getParent()).removeView(layout);

        notifyChanged();
    }
}

我假设您将保留 EditText 中的值,我将按钮的操作留给您。有关扩展 DialogPreference 的详细信息,请参阅 this post

为了获取SharedPreferences 的密钥,请将以下内容放入您的 XML:

<com.yourpackage.EditTextDialogPreference
    android:key="Your Key"
    android:persistent="true"/>

【讨论】:

  • @user 正如 K_Anas 所说,当您的问题解决后,请记住将答案标记为已接受。这确实有助于后来遇到类似问题的其他人。
  • 非常感谢,一切正常,但是当我调用 addPreferencesFromResource(R.xml.preferences) 时,它不会保留该值。
  • 您要返回什么?首选项键是否有效,并且只有一个空白字符串?还是根本没有钥匙?
  • 如何在我的preferencesActivity 中获得该按钮的点击事件?
【解决方案2】:

这是一个基于@gobernador 答案但使用RelativeLayout 的更具体的类:

class EditTextDialogPreference extends DialogPreference {

    //Layout Fields
    private final RelativeLayout layout = new RelativeLayout(this.getContext());
    private final EditText editText = new EditText(this.getContext());
    private final Button button = new Button(this.getContext());


    //Called when addPreferencesFromResource() is called. Initializes basic paramaters
    public EditTextDialogPreference(final Context context, AttributeSet attrs) {
        super(context, attrs);
        setPersistent(true);
        button.setText("Button");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             //button action
            }
        });
        editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
    }

    //Create the Dialog view
    @Override
    protected View onCreateDialogView() {
        layout.addView(editText);
        layout.addView(button);

        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) button.getLayoutParams();
        params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        return layout;
    }

    //Attach persisted values to Dialog
    @Override
    protected void onBindDialogView(View view) {
        super.onBindDialogView(view);
        editText.setText(getPersistedString("EditText"), TextView.BufferType.NORMAL);
    }

    //persist values and disassemble views
    @Override
    protected void onDialogClosed(boolean positiveresult) {
        super.onDialogClosed(positiveresult);
        if (positiveresult && shouldPersist()) {
            String value = editText.getText().toString();
            if (callChangeListener(value))
                persistString(value);
        }

        ((ViewGroup) editText.getParent()).removeView(editText);
        ((ViewGroup) button.getParent()).removeView(button);
        ((ViewGroup) layout.getParent()).removeView(layout);

        notifyChanged();
    }

    public void setValue(String value) {
        editText.setText(value);
    }
}

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多