Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> EditText 關於控件的一些技巧

EditText 關於控件的一些技巧

編輯:關於android開發

EditText 關於控件的一些技巧


1.避免EditText輸入日期時的驗證

當在EditText輸入日期時,通常需要對輸入的日期進行驗證,然而我們可以用Button代替EditText,從而避免驗證。 首先,使用Button控件替代EditText控件,但給Button控件設置一個EditText控件的背景,使之看起來像一個EditText控件,如下:
這裡的@android:drawable/edit_text是系統自帶的背景,即EditText的背景。 然後在java代碼裡實現當用戶點擊這個控件時彈出一個日期選擇對話框,讓用戶直接選擇日期,而不是輸入
  private int mYear;
  private int mMonth;
  private int mDay;
  private OnDateSetListener mDateSetListener;
  private Button mDateButton;
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // get the current date
    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);

    mDateSetListener = new DatePickerDialog.OnDateSetListener() {
      @Override
      public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        mDateButton.setText(getString(R.string.picked_date_format, monthOfYear, dayOfMonth, year));
      }
    };

    mDateButton=(Button)findViewById(R.id.details_date);
    mDateButton.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        showDatePickerDialog();
      }
    });
  }
  private void showDatePickerDialog(){
    new DatePickerDialog(this,mDateSetListener,mYear, mMonth,mDay).show();
  }
總結:你也許會問,為什麼不直接在EditText上設置點擊事件,而要用一個Button去替代呢?因為使用Button更加安全,用戶也不能修改Button的文字顯示。你也可以使用TextWatcher來驗證用戶的輸入,但是這將耗費更多的時間。在app中使用android的系統資源能非常好地利用設備的原有風格。    

2.格式化TextView的文字顯示

\ 上面這條tweet,由不同的文字風格和顏色組成:黑色、藍色,還有一部分點擊可以打開一個網址。讓人覺得這是一個自定義控件來展示這些信息,實際上只用一個TextView控件就能實現。下面將通過一個例子來展示如何給TextView添加不同風格的文字和超鏈接。 這是xml布局:

    
這是java代碼:
public class MainActivity extends AppCompatActivity {

    TextView helloWorldText;
    TextView textTwo;
    String textLink="visit Sina Home";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //第一個添加超鏈接
        helloWorldText=(TextView)findViewById(R.id.hello_world);
        helloWorldText.setText(Html.fromHtml(textLink));
        helloWorldText.setMovementMethod(LinkMovementMethod.getInstance());
        //第二個改變前景色和背景色
        textTwo=(TextView)findViewById(R.id.text_2);
        Spannable spannable=new SpannableString(textTwo.getText());
        spannable.setSpan(new BackgroundColorSpan(Color.BLUE),2,5,0);//背景藍色
        int index=textTwo.getText().toString().indexOf(",");//獲取“,”的位置
        spannable.setSpan(new ForegroundColorSpan(Color.YELLOW),index,textTwo.getText().length(),0);//前景黃色
        textTwo.setText(spannable);
    }
}
效果如下:點擊Sina Home可以跳轉到新浪首頁
\

3.給文字添加發光效果

給文字添加如下圖所示的LED效果。 \   首先新建一個LedTextView繼承自TextView,這個類主要用於設置字體效果。
public class LedTextView extends TextView {

  private static final String FONTS_FOLDER = "fonts";
  private static final String FONT_DIGITAL_7 = FONTS_FOLDER
      + File.separator + "digital-7.ttf";

  public LedTextView(Context context) {
    super(context);
    init(context);
  }

  public LedTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
  }

  public LedTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
  }

  private void init(Context context) {
    AssetManager assets = context.getAssets();
    final Typeface font = Typeface.createFromAsset(assets,FONT_DIGITAL_7);//設置字體
    setTypeface(font);
  }

}
然後在布局中設置兩個LedTextView,一個用來顯示88:88:88的背景,一個用來顯示當前的時間,如下:


    

    

在activity中設置
public class MainActivity extends Activity {

  private static final String DATE_FORMAT = "%02d:%02d:%02d";
  private static final int REFRESH_DELAY = 500;

  private final Handler mHandler = new Handler();
  private final Runnable mTimeRefresher = new Runnable() {
    @Override
    public void run() {
      final Date d = new Date();
      mTextView.setText(String.format(DATE_FORMAT, d.getHours(),
          d.getMinutes(), d.getSeconds()));
      mHandler.postDelayed(this, REFRESH_DELAY);
    }
  };

  private TextView mTextView;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mTextView = (TextView) findViewById(R.id.main_clock_time);
  }

  @Override
  protected void onResume() {
    super.onResume();
    mHandler.post(mTimeRefresher);
  }

  @Override
  protected void onStop() {
    super.onStop();
    mHandler.removeCallbacks(mTimeRefresher);
  }
}
其中%02d是用來限制數字格式的,2是代表寬度,如果整數不夠2列就補上0,比如printf("%02d" ,3);結果就是03,
如果數字大於2則沒有影響,比如printf("%02d",1234);結果是1234  

4.為控件添加圓角背景

直接給控件添加一個drawable背景就行了,沒什麼好說的

    
    
 


5.在onCreate()方法中獲取控件的高度和寬度

如果在onCreate()方法中直接調用view的getHeight()和getWidth()方法,都只會返回0,也就是獲取不到控件的高和寬。因為布局的繪制過程分為兩個步驟,measure和layout,首先測量布局和其中每一個控件的寬和高,然後確定每一個控件在布局中的擺放位置。控件在第二個步驟才能獲得寬度和高度,而layout發生在onCreate()方法調用之後,因此在onCreate()方法中無法獲得控件的寬高。 為了解決這一問題,可以使用view的post()方法,這個方法接收一個Runnable參數並把它添加到消息隊列中。這個Runnable方法在ui線程中執行。 java代碼如下:
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mTextView = (TextView) findViewById(R.id.main_clock_time);
    Log.d("crx","before post:textView.width="+mTextView.getWidth()+",textView.height="+mTextView.getHeight());
    mTextView.post(new Runnable() {
      @Override
      public void run() {
        Log.d("crx","after post:textView.width="+mTextView.getWidth()+",textView.height="+mTextView.getHeight());
      }
    });
  }
下面輸出的結果: \  

6.VideoViews和橫豎屏切換

這一節主要展示如何讓視頻在手機旋轉的時候自動轉換橫豎屏 首先布局的時候可以讓VidioViews占據整個屏幕,但不可見。然後設置一個view控件,放在當手機豎著時視頻的位置。 然後在Manifest文件中為當前activity設置android:configChanges="orientation"屬性,這樣當手機旋轉時就會自動調用onConfigurationChanged()方法。 因此就可以在onConfigurationChanged()方法中添加如下代碼:
switch (getResources().getConfiguration().orientation) {//判斷橫豎屏
    case Configuration.ORIENTATION_LANDSCAPE: {//如果是橫屏
      mPortraitContent.setVisibility(View.GONE);//隱藏豎屏控件
      //設置VideoViews的高和寬等屬性
      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
      params.addRule(RelativeLayout.CENTER_IN_PARENT);
      mVideoView.setLayoutParams(params);
      break;
    }

    case Configuration.ORIENTATION_SQUARE:
    case Configuration.ORIENTATION_UNDEFINED:
    case Configuration.ORIENTATION_PORTRAIT:
    default: {//豎屏

      mPortraitContent.setVisibility(View.VISIBLE);//隱藏橫屏控件
      int[] locationArray = new int[2];
      mPortraitPosition.getLocationOnScreen(locationArray);//獲取控件高和寬
      //設置視頻空間高和寬
      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(mPortraitPosition.getWidth(), mPortraitPosition.getHeight());
      params.leftMargin = locationArray[0];
      params.topMargin = locationArray[1];
      mVideoView.setLayoutParams(params);

      break;
    }
 }
   

7.移除背景,提高Activity啟動速度

在Android ADK中,有一個叫做Hierarchy Viewer的工具,使用這個工具能夠清楚地看出布局的層級和復雜程度。(注:真機調試下可能無法查看,如果要使用Hierarchy Viewer最好使用模擬器) 如果我們創建一個默認的android項目,布局代碼如下:


    

    

在Hierarchy Viewer中查看此布局的層級關系圖如下: \

這個布局中actionbar占了很大部分,實際上我們的布局代碼中並沒有,是項目的主題自帶的,如果去掉actionbar,將會極大地簡化布局的層級關系 我們可以在res/values文件夾下添加一個my_theme.xml,在裡面自定義主題

把title去掉之後,布局層級關系如下圖: \
可見層級樹深度也降低了一層,分支也少了。在真機上啟動app速度也快了一些。
我們已經知道布局裡有LinearLayout和LedTextView,這裡的DectorView和FrameLayout如何解釋呢?FrameLayout是在執行setContentView()方法時創建的,DectorView是層級樹的根節點。默認情況下,FrameLayout將會填充整個屏幕,並且擁有默認的背景顏色。DectorView則持有整個屏幕背景。如果我們的UI背景是自定義的,默認情況下設備仍然會花費時間去繪制默認背景。因此如果我們確認不會使用默認背景,就可以把默認背景移除掉,這樣可以加快activity的創建速度。 去除默認背景的方法也很簡單,只要在剛才的style屬性中添加一項屬性如下:



8.自定義Toast

Toast的位置默認在屏幕底部正中間,但是我們也能讓Toast顯示在其它位置。使用Toast.setGravity(int gravity, int xOffset, int yOffset)方法。 比如:
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
讓toast顯示在屏幕的左上角   自定義一個Toast 先在xml中寫好toast的布局,如下:

    
    
然後在java代碼中把布局添加到toast中並顯示出來:
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast,(ViewGroup)findViewById(R.id.toast_layout_root));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("This is a custom toast");

Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();

 
 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved