【导语】“我在北京吃炸鸡”通过精心收集,向本站投稿了6篇Android登陆界面采用文件存储实现,下面是小编给大家整理后的Android登陆界面采用文件存储实现,欢迎大家借鉴与参考,希望对大家有所帮助。
- 目录
篇1:Android登陆界面采用文件存储实现
布局的代码:
xmlns:tools=“schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical” >
android:layout_width=“match_parent”
android:layout_height=“wrap_content” >
android:id=“@+id/view_name”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“@string/text_name” />
android:id=“@+id/edit_name”
android:layout_width=“0dp”
android:layout_height=“wrap_content”
android:layout_weight=“1”
android:ems=“10”
android:inputType=“textPersonName” >
android:layout_width=“match_parent”
android:layout_height=“wrap_content” >
android:id=“@+id/view_pass”
篇2:Android实现用户引导界面
首先看效果图,盗了超级课程表几张图
在众多应用中,几乎每一款应用都有自己的Splash用户引导界面,该界面在用户首次启动展示,之后不会显示,主要向用户展示新功能.
分析
主要使用ViewPager+Indicator实现 主要是实现一个圆形指示器,这个圆形指示器继承LinearLayout,需要有一些属性可以自定义,比如指示器的颜色,大小,边距等 这个指示器也可以自动滚动,比如应用在幻灯片展示的地方 指示器是圆形的,需要我们自己绘制 这个圆形指示器实现了ViewPager.OnPageChangeListener接口实现
定义自定义属性属性的意思见名字就可以知道了
定义自定义变量,从布局文件中解析进来,此外,如果布局文件没有使用,应该有一个默认的常量.
定义默认常量
private static final int DEFAULT_CIRCLE_SPACING = 5; private static final int DEFAULT_CIRCLE_COLOR=Color.WHITE; private static final int DEFAULT_CIRCLE_SIZE=3; private static final boolean DEFAULT_CIRCLE_AUTO_SCROLL=false; private static final int DEFAULT_CIRCLE_SCROLL_DELAY_TIME=3000; private static final boolean DEFAULT_CIRCLE_SCROLL_ANIMATION=true;
定义用于存储自定义属性的变量
private int mSpacing; private int mSize; private int mFillColor; private int mStrokeColor; private boolean mAutoScroll; private int mDelayTime; private boolean mIsAnimation;
定义其他辅助变量,比如Canvas,Bitmap,Paint等,用于绘制圆形指示器
private static final int CIRCLE_STROKE_WIDTH =1; private static final int BITMAP_PADDING =2; private ViewPager mViewPager; private int mCount; private int mLastIndex = 0; private Canvas mCanvas; private Paint mPaint; private Bitmap mSelectBitmap; private Bitmap mUnselectBitmap;
将自定义属性进行解析赋值给对应变量
private void initCustomParams(Context context, AttributeSet attrs) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleIndicator); try {mSpacing = typedArray.getDimensionPixelSize(R.styleable.CircleIndicator_circle_spacing, DEFAULT_CIRCLE_SPACING);mFillColor=typedArray.getColor(R.styleable.CircleIndicator_circle_fill_color,DEFAULT_CIRCLE_COLOR);mStrokeColor=typedArray.getColor(R.styleable.CircleIndicator_circle_stroke_color,DEFAULT_CIRCLE_COLOR);mSize= typedArray.getDimensionPixelSize(R.styleable.CircleIndicator_circle_radius, DEFAULT_CIRCLE_SIZE);mAutoScroll= typedArray.getBoolean(R.styleable.CircleIndicator_circle_auto_scroll, DEFAULT_CIRCLE_AUTO_SCROLL);mDelayTime=typedArray.getInt(R.styleable.CircleIndicator_circle_scroll_delay_time,DEFAULT_CIRCLE_SCROLL_DELAY_TIME);mIsAnimation=typedArray.getBoolean(R.styleable.CircleIndicator_circle_scroll_animation,DEFAULT_CIRCLE_SCROLL_ANIMATION); } finally {typedArray.recycle; } }
我们的指示器是自己绘制出来的,接下来绘制圆形指示器
private void init() { setOrientation(HORIZONTAL); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeWidth(dip2px(CIRCLE_STROKE_WIDTH)); mPaint.setColor(mFillColor); int size=dip2px(mSize+ BITMAP_PADDING + BITMAP_PADDING); int radius=dip2px(mSize / 2); int centerPoint=radius+ BITMAP_PADDING; mSelectBitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); mUnselectBitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); mCanvas = new Canvas(); mCanvas.setBitmap(mSelectBitmap); mCanvas.drawCircle(centerPoint, centerPoint, radius, mPaint); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(mStrokeColor); mCanvas.setBitmap(mUnselectBitmap); mCanvas.drawCircle(centerPoint, centerPoint, radius, mPaint); }
实现构造方法,最终调用三个参数的构造方法,并调用相关函数进行初始化
public CircleIndicator(Context context) { this(context, null); } public CircleIndicator(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CircleIndicator(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initCustomParams(context, attrs); init(); }
实现指示器相关逻辑
首先需要初始化指示器的位置,应该是ViewPager的第一页,即初始化位置为0,调用initIndicator,并设置指示器的背景图为选中状态.记录上次指示器的位置即当前位置. removeIndicator移出指示器只要移出当前类的所有子View即可 updateIndicator需要将上次的位置背景图设置为未选中,当前位置设置未选中,并记录上次位置为当前位置 addIndicator需要将圆形指示器的数目传入,其值为ViewPager的页数,并新建ImageView设置背景图为未选中的时候的图,并设置外边距,将其添加到当前类的子View中,如果设置了自动滚动,还需要进行自动滚动 setViewPager函数进行一些初始化操作public void setViewPager(ViewPager viewPager) { mViewPager = viewPager; mViewPager.addOnPageChangeListener(this); if (mViewPager != null) {mCount = mViewPager.getAdapter().getCount();addIndicator(mCount); } } private void addIndicator(int count) { removeIndicator(); if (count <= 0)return; for (int i = 0; i < count; i++) {ImageView imageView = new ImageView(getContext());LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);params.leftMargin = mSpacing/2;params.rightMargin = mSpacing/2;imageView.setImageBitmap(mUnselectBitmap);addView(imageView, params); } initIndicator(); if(mAutoScroll){sendScrollMessage(mDelayTime); } } private void initIndicator() { ((ImageView) getChildAt(0)).setImageBitmap(mSelectBitmap); mLastIndex=0; } private void removeIndicator() { removeAllViews(); } private void updateIndicator(int position) { if (position != mLastIndex) {((ImageView) getChildAt(mLastIndex)).setImageBitmap(mUnselectBitmap);((ImageView) getChildAt(position)).setImageBitmap(mSelectBitmap); } mLastIndex = position; }
实现自动滚动,主要通过Handler进行延时实现
private Handler mHandler=new Handler(){ @Override public void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) { case SCROLL_WHAT: scrollOnce(); sendScrollMessage(mDelayTime); break;} } }; public void scrollOnce() { PagerAdapter adapter = mViewPager.getAdapter(); if (adapter == null) {return; } int nextIndex=mViewPager.getCurrentItem(); ++nextIndex; if(nextIndex >=mCount){nextIndex =0; } updateIndicator(nextIndex); mViewPager.setCurrentItem(nextIndex, mIsAnimation); } private void sendScrollMessage(long delayTimeInMills) { mHandler.removeMessages(SCROLL_WHAT); mHandler.sendEmptyMessageDelayed(SCROLL_WHAT, delayTimeInMills); }
实现相关getter和setter函数
private void setAutoScroll(boolean autoScroll){ if (autoScroll){sendScrollMessage(mDelayTime); }else{mHandler.removeMessages(SCROLL_WHAT); } mAutoScroll=autoScroll; } public boolean isAutoScroll() { return mAutoScroll; } public int getDelayTime() { return mDelayTime; } public void setDelayTime(int delayTime) { mDelayTime = delayTime; } public boolean isAnimation() { return mIsAnimation; } public void setIsAnimation(boolean isAnimation) { mIsAnimation = isAnimation; }
实现接口相关函数
@Override public void onPageScrolled(int i, float v, int i1) { } @Override public void onPageSelected(int position) { updateIndicator(position); } @Override public void onPageScrollStateChanged(int i) { }
以及一个单位转换的工具函数
private int dip2px(int dip) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, getResources().getDisplayMetrics()); }
使用
private void initView() { mViewPager= (ViewPager) findViewById(R.id.viewpager); mCircleIndicator= (CircleIndicator) findViewById(R.id.circle_indicator); mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {private int[] resId={R.mipmap.ic_help_view_1,R.mipmap.ic_help_view_2,R.mipmap.ic_help_view_3,R.mipmap.ic_help_view_4};private Map
package cn.edu.zafu.splash;import android.content.Intent;import android.os.Bundle;import android.support.v4.app.Fragment;import android.util.TypedValue;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.RelativeLayout;public class BlankFragment extends Fragment { private static final String IMAGE_ID = imageId; private static final String CUCRNT = curcent; private static final String TOTAL = total; private int mImageId; private int mCurcent; private int mTotal; public static BlankFragment newInstance(int imageId,int current,int total) { BlankFragment fragment = new BlankFragment(); Bundle args = new Bundle(); args.putInt(IMAGE_ID, imageId); args.putInt(CUCRNT, current); args.putInt(TOTAL, total); fragment.setArguments(args); return fragment; } public BlankFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) {mImageId = getArguments().getInt(IMAGE_ID);mCurcent = getArguments().getInt(CUCRNT);mTotal = getArguments().getInt(TOTAL); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view= inflater.inflate(R.layout.fragment_blank, container, false); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); super.onViewCreated(view, savedInstanceState); ImageView imageView= (ImageView) view.findViewById(R.id.image); imageView.setImageResource(mImageId); if(mCurcent==mTotal-1){RelativeLayout relativeLayout= (RelativeLayout) view.findViewById(R.id.relativelayout);ImageButton button=new ImageButton(getActivity().getApplicationContext());button.setBackgroundResource(R.drawable.last_button_selector);RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);params.addRule(RelativeLayout.CENTER_HORIZONTAL);params.bottomMargin=dip2px(80);relativeLayout.addView(button,params);button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int versionCode=Util.getAppVersionCode(getActivity()); Util.set(getActivity(),Util.FILE_NAME,versionCode+,true); Intent intent=new Intent(getActivity(),SecondActivity.class); startActivity(intent); getActivity().finish(); }}); } } private int dip2px(int dip) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, getActivity().getResources().getDisplayMetrics()); }}
如果要实现是否首次启动,如果是才显示的话需要加一些逻辑判断,如果当前版本号已经持久化了,则直接跳过,这个数据是在Splash页面最后一个按钮点击事件里处理的
private boolean ignoreSplash() { if(Util.contatins(this, Util.FILE_NAME, Util.getAppVersionCode(this) + )){Intent intent=new Intent(MainActivity.this,SecondActivity.class);startActivity(intent);this.finish();return true; } return false; }
public void onClick(View v) { int versionCode=Util.getAppVersionCode(getActivity()); Util.set(getActivity(),Util.FILE_NAME,versionCode+,true); Intent intent=new Intent(getActivity(),SecondActivity.class); startActivity(intent); getActivity().finish(); }
篇3:Android数据存储方式之:文件存储
android应用大多数用的java开发,所以java的文件操作在android中完全适用,只不过android对手机而言,多了个外存储设置SD卡,
----------------------------------------------简单的界面布局-----------------------------------------------------------
xmlns:tools=“schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical” >
android:id=“@+id/input_edt”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:hint=“请输入保存内容” />
android:id=“@+id/write_btn”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“保存数据” />
android:id=“@+id/read_btn”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“读取数据” />
-----------------------------功能代码-----------------------------------------------------------
public class MainActivity extends Activity implements OnClickListener {
/**内容输入框 */
private EditText inputEdt;
/**保存(写入)按钮 */
private Button writeBtn;
/**读取按钮 */
private Button readBtn;
/**要保存的文件名*/
private static final String FILE_NAME = “temp_file.txt”;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewsById();
}
private void findViewsById() {
inputEdt = (EditText) findViewById(R.id.input_edt);
writeBtn = (Button) findViewById(R.id.write_btn);
readBtn = (Button) findViewById(R.id.read_btn);
writeBtn.setOnClickListener(this);
readBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.write_btn:
writeData();
break;
case R.id.read_btn:
String result = readData();
inputEdt.setText(result);
break;
}
}
/*
* 方法openFileOutput(FILE_NAME, Activity.MODE_PRIVATE); 参数说明:以FILE_NAME文件名,Activity.MODE_PRIVATE文件的应用模式,打开一个输出流如果文件不存系统会为你创建一个 注意这里的文件名称不能包括任何的/或者/这种分隔符,只能是文件名
* 该文件会被保存在/data/data/应用名称/files/temp_file.txt 文件的操作模式有以下四种:MODE_PRIVATE 私有(只能创建它的应用访问) 重复写入时会文件覆盖MODE_APPEND 私有 重复写入时会在文件的末尾进行追加,而不是覆盖掉原来的文件 MODE_WORLD_READABLE 公用 可读 MODE_WORLD_WRITEABLE 公用 可读写
*/
private void writeData() {
String content = inputEdt.getText().toString();
try {
FileOutputStream utputStream = openFileOutput(FILE_NAME, Activity.MODE_PRIVATE);
outputStream.write(content.getBytes());
outputStream.flush();
outputStream.close();
Toast.makeText(MainActivity.this, “保存成功”, Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 把刚刚保存的数据读出来
* */
private String readData() {
String content = “”;
try {
FileInputStream inputStream = this.openFileInput(FILE_NAME);
byte[] bytes = new byte[1024];
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
while (inputStream.read(bytes) != -1) {
arrayOutputStream.write(bytes, 0, bytes.length);
}
inputStream.close();
arrayOutputStream.close();
content = new String(arrayOutputStream.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
/****************上面的内容是把内容存到手机内存中*************************************/
/**判断SDcard是否存在并且可读写*/
private boolean isSDcardExist() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
return true;
} else {
Toast.makeText(getApplicationContext(), “内存卡不可用”, 1000).show();
return false;
}
}
/**往内存卡中存文件*/
public void writeToSDCard(String filename, String filecontent) throws Exception {
File file = new File(Environment.getExternalStorageDirectory(), filename);
FileOutputStream utStream = new FileOutputStream(file);
outStream.write(filecontent.getBytes());
outStream.close();
}
/**读SD卡中对应文件的内容*/
private String readSDCardFile(String filePath, String fileName) {
String result = “”;
try {
File file = new File(filePath, fileName);
FileInputStream is = new FileInputStream(file);
byte[] b = new byte[is.available()];
is.read(b);
result = new String(b);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
---------注:-------------------------------------------
SD卡操作不要忘记在AndroidManifest.xml中添加对应权限:
篇4:Android Sharedpreferences实现用户偏好存储
Shareepreference 是android提供的一个轻量级的数据存储框架,形式就是键值对的形式,熟悉xml的朋友应该比较习惯这种风格,就是“属性名-属性值”的形式,从名字就可以看出,这个框架主要是用于设置用户的一个偏好,他的一个特点是可以跨session的共享,在多个activity之间可以操作,如果设置特别的权限,其他应用也可以访问。下面就是使用的一个基本方法。
1:获取类型SharedPreferences
主要有两种方式可以获得
getSharedPreferences (String name, int mode)接受两个参数,第一个是文件标示,第二个是权限,用于创建多个配置文件的场景
//name为文件名,注:不加后缀。如果不存在的话,会自动创建。保存的数据是存放在data/data/ 你的包名/name.xml文件中
getPreferences( int mode)- 只有文件权限参数,与上一个不同在于只创建一个文件。
//mode操作模式,共4种,如下:
MODE_PRIVATE 这是默认的形式,配置文件只允许本程序和享有本程序ID的程序的访问
MODE_WORLD_READABLE 允许其他的应用程序读文件
MODE_WORLD_WRITEABLE 允许其他的应用程序写文件
MODE_MULTI_PROCESS 主要用于多任务,2.3版本当多个进程共同访问的时候,必须指定这个标签
Editor来进行偏好的编辑与设置,
Editor主要包含一些putXXX方法,支持booleans, floats, ints, longs, and strings.几种类型,最后完成添加后,一定要调用commit方法或者apply方法进行修改后的提交。
如果想得到value的话就自己直接用SharedPreference类来使用相应的getxxx方法就好了。
SharedPreferences myPreference = this.getSharedPreferences(“filename”, Context.MODE_PRIVATE);
Editor editor = myPreference.edit;
editor.putString(“COLOR”, “red”);
editor.commit();
clear()用来删除所有的 数据
remove(String key)用来根据保存的键值进行删除
这两个函数都返回的是是SharedPreferences.Editor 在返回以后,需要commit()
篇5:Android 从FrameBuffer中读取界面数据实现截图
要实现从应用层截系统屏幕的功能 , 首先你的应用需要有读取系统文件的权限 ,如何通过process = Runtime.getRuntime().exec(su); 的方式得到权限有在“Android底层事件注入,控制系统的触摸、点击、各个按钮触发”博客中提到 blog.csdn.net/fanjunjian1991/article/details/44648287 ,各位看官可前去瞧瞧,
这次截屏功能实现的方式主要读取系统FrameBuffer里的内容,利用/dev/graphics/fb0这个设备节点。【/dev/graphics/fb0代表了LCD的FrameBuffer缓冲区驱动程序,操作该驱动,即相当于操作LCD 的FrameBuffer。所以,由此出发,通过读取/dev/graphics/fb0的内容,可以很容易就得到LCD屏幕上当前正在显示的内容。】
读取文件中数据的代码如下:
byte[] piex = new byte[width * height * deepth]; InputStream stream = new FileInputStream(new File(file_name)); DataInputStream dStream = new DataInputStream(stream); dStream.readFully(piex); dStream.close(); stream.close();
然后把读到的二进制数组转换为整形数组:
int[] data = convertToColor(piex);piex = null;
public static int[] convertToColor(byte[] piex) throws Exception {switch (deepth) {case 2:return convertToColor_2byte(piex);case 3:return convertToColor_3byte(piex);case 4:return convertToColor_4byte(piex);default:throw new Exception(Deepth Error!);}}
public static int[] convertToColor_2byte(byte[] piex) { int[] colors = new int[width * height]; int len = piex.length; for (int i = 0; i < len; i += 2) { int colour = (piex[i+1] & 0xFF) << 8 | (piex[i] & 0xFF); int r = ((colour & 0xF800) >>11)*8; int g = ((colour & 0x07E0) >>5)*4; int b = (colour & 0x001F)*8; int a = 0xFF; colors[i / 2] = (a << 24) + (r << 16) + (g << 8) + b; } return colors; } public static int[] convertToColor_3byte(byte[] piex) { int[] colors = new int[width * height]; int len = piex.length; for (int i = 0; i < len; i += 3) { int r = (piex[i] & 0xFF); int g = (piex[i + 1] & 0xFF); int b = (piex[i + 2] & 0xFF); int a = 0xFF; colors[i / 3] = (a << 24) + (r << 16) + (g << 8) + b; } return colors; } public static int[] convertToColor_4byte(byte[] piex) { int[] colors = new int[width * height]; int len = piex.length; for (int i = 0; i < len; i += 4) { int r = (piex[i] & 0xFF); int g = (piex[i + 1] & 0xFF); int b = (piex[i + 2] & 0xFF); int a = (piex[i + 3] & 0xFF); colors[i / 4] = (a << 24) + (r << 16) + (g << 8) + b; } return colors; }
最后把整形数组转换为位图:
Bitmap bm = Bitmap.createBitmap(data, width, height, Bitmap.Config.RGB_565); data = null;
篇6:利用INI文件实现界面无闪烁多语言切换.net
越来越多的程序使用了多国语言切换,虽然DELPHI自带多语言包的添加和配置,但是那种方法在切换语言时界面会出现闪烁,而且实现起来很麻烦,这里我介绍给大家的是利用INI文件来读取界面的语种文字,用这种方法,不但简单易行,而且在切换的时候不会出现界面的
越来越多的程序使用了多国语言切换,虽然DELPHI自带多语言包的添加和配置,但是那种方法在切换语言时界面会出现闪烁,而且实现起来很麻烦,这里我介绍给大家的是利用INI文件来读取界面的语种文字,用这种方法,不但简单易行,而且在切换的时候不会出现界面的闪烁,
我们从一个例子出发,看看怎么实现语言的切换。首先建立一个新工程。放置如下组件:
MainMenu1: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
Label1: TLabel;
Button1: TButton;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
Button2: TButton;
Label2: TLabel;
ComboBox1: TComboBox;
Label3: TLabel;
由于要读取Ini文件,所以在USES中加入声明IniFiles;然后将Button1和Button2的ShowHint属性设置为True;其中我们用ComboBox1来显示可供选择的语言和用来选择语言。
我们在程序的目录下编辑如下的Chinese GB.Ini文件:
;
;
; 翻译的一些规则:
; 翻译前,拷贝 Chinese GB.ini 改名到 yourlanguage.ini
; 仅仅翻译符号'='后的文字
;
[Translations]
;
Label1.Caption =文字1
Label2.Caption =文字2
Label3.Caption =语言
Button1.Caption =按钮1
Button2.Caption =按钮2
Button1.Hint =按钮1_提示
Button2.Hint =按钮2_提示
CheckBox1.Caption =复选框1
CheckBox2.Caption =复选框2
File1.Caption =文件
Exit1.Caption =退出
;
[Messages]
;
M1 =信息框测试
;
;
同样的方法编辑一个名为English.ini的文件,将“=”左边的文字改为英文。
例如:Label1.Caption =Label1
程序运行时,我们查找当前目录下所有的语言配置文件(*.ini),为了达到这个目的,我编写了如下的函数搜索目录下所有的语言配置文件的文件名,然后将文件名去掉ini扩展名保存返回:
function TForm1.SearchLanguagePack:TStrings;
var
ResultStrings:TStrings;
DosError:integer;
SearchRec:TsearchRec;
begin
ResultStrings:=TStringList.Create;
DosError:=FindFirst(ExtractFilePath(ParamStr(0))+'*.ini', faAnyFile, SearchRec);
while DosError=0 do
begin
{ 返回的文件名并去掉末尾的.ini字符 }
ResultStrings.Add(ChangeFileExt(SearchRec.Name,''));
DosError:=FindNext(SearchRec);
end;
FindClose(SearchRec);
Result:=ResultStrings;
end;
在Form建立的事件中添加代码,将目录下所有的语言文件名加入选择列表框中。
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.AddStrings(SearchLanguagePack);
end;
程序的重点在如何切换语言,在ComboBox1的OnChange事件中进行切换操作,
这里我写了SetActiveLanguage过程用于实现这一操作。
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
SetActiveLanguage(ComboBox1.Text);
end;
其中SetActiveLanguage代码如下:
procedure TForm1.SetActiveLanguage(LanguageName:string);
const
Translations='Translations';
Messages='Messages';
var
frmComponent:TComponent;
i:Integer;
begin
with TInifile.Create(ExtractFilePath(ParamStr(0))+LanguageName+'.ini') do
begin
for i:=0 to ComponentCount-1 do { 遍历Form组件 }
begin
frmComponent:=Components[i];
if frmComponent is TLabel then { 如果组件为TLabel型则当作TLabel处理,以下同 }
begin
(frmComponent as TLabel).Caption:=
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TLabel).Caption);
end;
if frmComponent is TCheckBox then
begin
(frmComponent as TCheckBox).Caption:=
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TCheckBox).Caption);
end;
if frmComponent is TButton then
begin
(frmComponent as TButton).Caption:=
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TButton).Caption);
(frmComponent as TButton).Hint:=
ReadString(Translations,frmComponent.Name+'.Hint',(frmComponent as TButton).Hint);
end;
if frmComponent is TMenuItem then
begin
(frmComponent as TMenuItem).Caption:=
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TMenuItem).Caption);
end;
end;
M1:=ReadString(Messages,'M1',M1);
end;
end;
在这个过程中,我们遍历了Form中的所有组件,根据他们的类别和组件名动态的从ini配置文件中读出应该显示的语言文字。用遍历组件的方法比一个一个写出具体的组件维护起来要方便很多,代码的适应性也更强。
其中M1为一个字符串变量,这样提示消息也能切换,比如在Button1的Click事件中
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(M1);
end;
就可以根据不同的语言给出不同的提示文字。
原文转自:www.ltesting.net
★ 文件范本
★ 文件范文
★ Android 源代码实例:实现上拉加载下拉刷新浮动效果
★ linux中利用shell实现批量转换文件编码linux操作系统
Android登陆界面采用文件存储实现(整理6篇)




