创建和显示布局时如何在视图上设置焦点?


90

目前,我有一个包含a Button,a TextView和an 的布局EditText。显示布局时,焦点将自动放在上EditText,这将触发键盘显示在Android手机上。这不是我想要的。TextView显示布局时,有什么方法可以将焦点设置在什么上?

Answers:


109

设置焦点:该框架将响应用户输入来处理移动焦点。若要将焦点强制到特定视图,请调用requestFocus()


17

这有效:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

它有什么作用?似乎它正在修改整个活动的某些状态,而不仅是视图或片段,因此我对此会保持谨慎,除非我了解其所有含义,否则请不要使用它。
Vaddadi Kartick 2014年

确实,我不会根据原始海报的要求执行此操作。这可以解决当前问题,但是使用它会产生副作用,以后可能会引起问题。像这样的hack进入了代码库,导致后来又添加了其他hack来抵消原始的hack。恶性循环还在继续……人们怀疑为什么代码变得不可维护。是的,您猜对了……我与其他从事此类工作的人一起工作,这使我的生活非常困难。
dell116 '17


6

 android:focusable="true"

在你的 <EditText/>


6

要设置焦点,请使用Handler延迟requestFocus()。

private Handler mHandler= new Handler();

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     LinearLayout mainVw = (LinearLayout) findViewById(R.id.main_layout);

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
           LinearLayout.LayoutParams.FILL_PARENT,
           LinearLayout.LayoutParams.WRAP_CONTENT);

     EditText edit = new EditText(this);
     edit.setLayoutParams(params);
     mainVw.addView(edit);

     TextView titleTv = new TextView(this);
     titleTv.setText("test");
     titleTv.setLayoutParams(params);
     mainVw.addView(titleTv);

     mHandler.post(
       new Runnable() 
       {
          public void run() 
          {
            titleTv.requestFocus();
          } 
       }
     );
   }
}

5

您可以尝试隐藏键盘。像这样:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);


3

将这些行OnResume也设置为,并确保focusableInTouch在初始化控件时将其设置为true

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();

3

更改焦点使xml中的textView可聚焦

<TextView
            **android:focusable="true"**
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

并在Java中创建

textView.requestFocus();

或者只是隐藏键盘

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}

android:focusable =“ true”和textView.requestFocus(); 为我工作。谢谢!
Werner

2

上面的答案都不适合我。唯一的(比方说)解决方案已经改变第一TextView中禁用 的EditText接收焦点,然后添加

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

onCreate回调中以防止显示键盘。现在,我的第一个EditText看起来像TextView,但最终可以得到最初的关注。


2

最后的建议是正确的解决方案。只是重复一下,首先android:focusable="true"在布局xml文件中设置,然后requestFocus()在代码视图中设置。


1

我认为文本视图无法聚焦。例如,尝试将焦点设置在按钮上,或将属性focusable设置为true。


1

您可以添加大小为“ 0 dip”的编辑文本作为ur xml中的第一个控件,因此,它将着重于render。(确保其可聚焦且全部...)


1

您可以从添加android:windowSoftInputModeAndroidManifest.xml文件活动中开始。

<activity android:name="YourActivity"
          android:windowSoftInputMode="stateHidden" />

这将使键盘不显示,但EditText仍会得到焦点。为了解决这个问题,你可以设置android:focusableInTouchmodeandroid:focusabletrue你的根视图。

<LinearLayout android:orientation="vertical"
              android:focusable="true"
              android:focusableInTouchMode="true"
              ...
              >
    <EditText
         ...
       />
    <TextView
         ...
       />
    <Button
         ...
       />
</LinearLayout>

上面的代码将确保RelativeLayout获得焦点,而不是EditText


0

当您使用触摸以外的其他东西(例如d-pad,键盘等)时,焦点用于选择UI组件。任何视图均可获得焦点,尽管默认情况下某些视图无法聚焦。(您可以将视图 setFocusable(true)设为可聚焦,并强制将其聚焦为requestFocus()。)

但是,请务必注意,当您处于触摸模式时,将禁用焦点。因此,如果您使用手指,则以编程方式更改焦点不会执行任何操作。对于从输入编辑器接收输入的视图,则例外。An EditText就是这样一个例子。对于这种特殊情况setFocusableInTouchMode(true),用于使软键盘知道将输入发送到哪里。一个EditText在默认情况下此设置。软键盘将自动弹出。

如果您不希望软键盘自动弹出,则可以暂时取消它,如@abeljus所述:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

但是,当用户单击时EditText,它仍应显示键盘。

进一步阅读:


这个答案错了​​吗?下投没有留下任何评论。
Suragch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.