如何从单个editText中删除焦点

时间:2010-10-08 11:30:59

标签: android

在我的应用程序中,我有一个EditText和一些TextViews,按钮和一个微调器。我相信,我的EditText会获得焦点,因为它是此活动中唯一可聚焦的视图。我的EditText显示橙色边框和光标在该字段上。

现在我想从这个字段中删除焦点(我不希望光标和边框显示)。有没有办法做到这一点?

我可以通过button.seFocusableInTouchMode()button.requestFocus()关注按钮。但这突出了按钮,显然不是我想要的。

17 个答案:

答案 0 :(得分:42)

您是否尝试使用旧版View.clearFocus()

答案 1 :(得分:35)

新到android ..试过

getWindow().getDecorView().clearFocus();

它对我有用..如果出现问题,请向我纠正:)

只是添加..你的布局应该有:

 android:focusable="true"
 android:focusableInTouchMode="true"

答案 2 :(得分:22)

检查这个问题和选定的答案:Stop EditText from gaining focus at Activity startup这很难看,但它有效,据我所知,没有更好的解决方案。

答案 3 :(得分:13)

我将尝试解释如何从EditText视图中删除焦点(闪烁光标)以及更多细节和理解。通常这行代码应该可以工作

editText.clearFocus()

但是当editText仍然具有焦点时可能会发生这种情况,因为clearFocus()方法正试图将焦点设置回活动/片段布局中的第一个可聚焦视图。

因此,如果活动中只有一个可聚焦的视图,这通常是您的EditText视图,那么clearFocus()会将焦点再次设置为该视图,对于您来说,看起来clearFocus()是不工作 请记住,默认情况下EditText视图是可聚焦的(true),因此如果您的布局中只有一个EditText视图,它将远离焦点在屏幕上。在这种情况下,您的解决方案是在布局文件中找到父视图(某些布局,ex LinearLayout,Framelayout)并将其设置为此xml代码

android:focusable="true"
android:focusableInTouchMode="true"

之后执行editText.clearFocus()时,布局中的父视图将接受焦点,并且您的editText将清除焦点。

我希望这有助于某人了解clearFocus()的运作方式。

答案 4 :(得分:3)

我知道为时已晚,但对于有相同需求的人来说,editText.setFocusable(false)就是你要找的。

答案 5 :(得分:2)

使用附加的代码将焦点放在“其他人”上,如果你有一个只想放弃键盘并释放焦点的视图就可以了,你真的不关心谁得到它。 / p>

像这样使用: FocusHelper.releaseFocus(viewToReleaseFocusFrom)

public class FocusHelper {
    public static void releaseFocus(View view) {
        ViewParent parent = view.getParent();
        ViewGroup group = null;
        View child = null;
        while (parent != null) {
            if (parent instanceof ViewGroup) {
                group = (ViewGroup) parent;
                for (int i = 0; i < group.getChildCount(); i++) {
                    child = group.getChildAt(i);
                    if(child != view && child.isFocusable())
                        child.requestFocus();
                }
            }
            parent = parent.getParent();
        }
    }
}

文档: 该方法从子视图遍历视图树并查找要关注的第一个子视图。

编辑: 您也可以使用API​​:

View focusableView = v.focusSearch(View.FOCUS_DOWN);
if(focusableView != null) focusableView.requestFocus();

答案 6 :(得分:2)

我在editText中遇到了类似的问题,该问题在活动开始后获得了关注。这个问题我很容易解决这个问题:

将这段代码添加到包含xml中的editText的布局中:

    android:id="@+id/linearlayout" 
    android:focusableInTouchMode="true"

不要忘记android:id,没有它我就有错误。

我对editText的另一个问题是,一旦获得第一个焦点,焦点就永远不会消失。这是我在java中的一段代码,它有一个editText和一个捕获editText中文本的按钮:

    editText=(EditText) findViewById(R.id.et1);
    tvhome= (TextView)findViewById(R.id.tv_home);
    etBtn= (Button) findViewById(R.id.btn_homeadd);
    etBtn.setOnClickListener(new View.OnClickListener() 
    {   
        @Override
        public void onClick(View v)
        {
            tvhome.setText( editText.getText().toString() );

            //** this code is for hiding the keyboard after pressing the button
            View view = Settings.this.getCurrentFocus();
            if (view != null) 
            {  
                InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            }
            //**

            editText.getText().clear();//clears the text
            editText.setFocusable(false);//disables the focus of the editText 
            Log.i("onCreate().Button.onClickListener()", "et.isfocused= "+editText.isFocused());
        }
    });
    editText.setOnClickListener(new View.OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            if(v.getId() == R.id.et1)
            {
                v.setFocusableInTouchMode(true);// when the editText is clicked it will gain focus again

                //** this code is for enabling the keyboard at the first click on the editText
                if(v.isFocused())//the code is optional, because at the second click the keyboard shows by itself
                {
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
                }
                //**

                Log.i("onCreate().EditText.onClickListener()", "et.isfocused= "+v.isFocused());
            }
            else
                Log.i("onCreate().EditText.onClickListener()", "the listener did'nt consume the event");
        }
    });

希望对你们中的一些人有所帮助!

答案 7 :(得分:2)

如果Edittext的父级布局是Linear,则添加

 android:focusable="true" 
 android:focusableInTouchMode="true"

如下所示

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:focusable="true"
            android:focusableInTouchMode="true">

           <EditText/>
          ............

当Edittext父级布局相对时,则

  android:descendantFocusability="beforeDescendants"
  android:focusableInTouchMode="true"

喜欢

  <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:descendantFocusability="beforeDescendants"
            android:focusableInTouchMode="true">

           <EditText/>
          ............

答案 8 :(得分:2)

我试图清除编辑文本的焦点。 clearfocus()和焦点和其他东西从来没有为我工作。 所以我想出了让虚假的edittext获得焦点的想法:

<LinearLayout
    ...
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        ...
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <!--here comes your stuff-->

    </LinearLayout>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fake"
        android:textSize="1sp"/>

</LinearLayout>

然后在你的java代码中:

View view = Activity.this.getCurrentFocus();
                    if (view != null) {
                        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                        fake.requestFocus();
                    }

它会隐藏键盘并删除任何包含它的edittext的焦点。而且当你看到假的edittext不在屏幕上而且看不到时

答案 9 :(得分:2)

找到另一个视图并改为关注它。

var refresher = FindViewById<MvxSwipeRefreshLayout>(Resource.Id.refresher);

refresher.RequestFocus();

答案 10 :(得分:1)

这对我来说很有效

将这些属性添加到您的EditText

android:focusable="true"
android:focusableInTouchMode="true"

之后,您只需编写代码即可

editText.clearFocus()

答案 11 :(得分:0)

因为我在一个小部件而不是我做过的活动中:

`getRootView()clearFocus();

答案 12 :(得分:0)

您只需要从视图中清除焦点

EditText.clearFocus()

答案 13 :(得分:0)

(pipeline 
    | ...
    | "print" >> beam.Map(print)
)

result = pipeline.run()
result.wait_until_finish()

答案 14 :(得分:0)

如果我理解你的问题,这可以帮到你:

TextView tv1 = (TextView) findViewById(R.id.tv1);
tv1 .setFocusable(false);

答案 15 :(得分:0)

您只需要使用以下属性设置ViewGroup:

android:focusableInTouchMode="true"

ViewGroup是包含每个子视图的布局。

答案 16 :(得分:0)

只需包含此行

android:selectAllOnFocus="false"

在与EditText布局对应的XML段中。