EditText 中可点击的复合可绘制对象,点击时会弹出一个视图

Posted

技术标签:

【中文标题】EditText 中可点击的复合可绘制对象,点击时会弹出一个视图【英文标题】:Clickable compound drawable in EditText that pops a view on click 【发布时间】:2012-07-24 19:57:40 【问题描述】:

我正在使用 TextWatcher 来验证我的输入,并且我希望我的红色提示图像是可点击的,这样我就可以给用户视觉反馈,如下图所示。到目前为止,我所拥有的是当我输入无效数据时出现红色提示图像的编辑文本。我现在想知道如何使这个红色提示可点击,并使弹出提示如图所示。

这是我目前的代码,

public class MainActivity extends Activity implements TextWatcher

    EditText username,email = null;
    boolean flag=false;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);      

        username=(EditText) findViewById(R.id.usernametxt);
        email=(EditText) findViewById(R.id.emailtxt);

        username.addTextChangedListener(this);

        username.setOnTouchListener(new View.OnTouchListener()
        public boolean onTouch(View view, MotionEvent motionEvent) 
            // your code here...
            if(flag)
            
                email.setText("Error. . .");
            
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);                
            return false;
            
        );

        Button loginbtn = (Button) findViewById(R.id.login);
        loginbtn.setOnClickListener(new Button.OnClickListener() 

            public void onClick(View v) 
                // TODO Auto-generated method stub

                //Check Validations
                if(username.getText().toString().equalsIgnoreCase(""))
                
                    username.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.alert, 0);
                    flag=true;
                
            
        );

        Button clearbtn = (Button) findViewById(R.id.clear);
        clearbtn.setOnClickListener(new Button.OnClickListener() 

            public void onClick(View v) 
                // TODO Auto-generated method stub
                username.setText("");
                email.setText("");      
            
        );
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    

    public void afterTextChanged(Editable arg0) 
        // TODO Auto-generated method stub

    

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) 
        // TODO Auto-generated method stub

    

    public void onTextChanged(CharSequence s, int start, int before, int count) 
        // TODO Auto-generated method stub      
        username.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
        flag=false;
        email.setText("");
       

【问题讨论】:

@Akki 发布的图片是我想要实现的。我现在只有当用户输入无效数据时才有红色图像。我想让用户单击红色图像提示时出现图像中显示的弹出窗口。 我现在仍然很确定我理解了这个问题。 我用PopupWindowdeveloper.android.com/reference/android/widget/PopupWindow.html实现了一个类似的功能 @MichalK 如何使 editText 中的红色提示图像可点击,以便我可以使用 popupwindow? 使用 onClickListener 可以附加到任何View,包括您的ImageView:developer.android.com/reference/android/view/… 【参考方案1】:

您必须自定义EditText 才能获得第一个功能。

Solved here

点击drawable的弹出视图可以通过PopupWindow来完成

Solved here.

【讨论】:

Popupwindow 正是我所需要的。谢谢。【参考方案2】:

如果您将红色提示图像用作 EditText usernametxt 右侧的复合可绘制对象,则非常简单。 下面就可以解决问题了。

EditText username = (EditText) findViewById(R.id.usernametxt);
username.setOnTouchListener(new OnTouchListener() 
    @Override
    public boolean onTouch(View v, MotionEvent event) 
        if(event.getAction() == MotionEvent.ACTION_UP) 
            if(event.getRawX() >= username.getRight() - username.getTotalPaddingRight()) 
                // your action for drawable click event

             return true;
            
        
        return true;
    
);

如果你想要左侧可绘制,请将 if 语句更改为:

if(event.getRawX() <= username.getTotalPaddingLeft())

同样,您可以对所有复合可绘制对象执行此操作。

username.getTotalPaddingTop()
username.getTotalPaddingBottom()

此方法调用返回该侧的所有填充,包括任何可绘制对象。您甚至可以将它用于 TextView、Button 等。

点击here来自android开发者网站的参考。

【讨论】:

以上是关于EditText 中可点击的复合可绘制对象,点击时会弹出一个视图的主要内容,如果未能解决你的问题,请参考以下文章

在 EditText 背景外绘制复合可绘制对象

Android Edittext Drawable 点击卡住焦点

获取 ImageView 中可绘制对象的 ID

仅为 TextView 复合可绘制对象实现 onClick

android中EditText内的可点击按钮(或任何视图)

在 android 的 RecyclerView 中可点击的一项