Android登陆界面采用文件存储实现

时间:2023-01-24 04:03:04 作者:我在北京吃炸鸡 综合材料 收藏本文 下载本文

【导语】“我在北京吃炸鸡”通过精心收集,向本站投稿了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 MapmFragments=new HashMap();@Overridepublic Fragment getItem(int i) { Fragment fragment=mFragments.get(i); if(fragment==null){ fragment=BlankFragment.newInstance(resId[i],i,resId.length); mFragments.put(i,fragment); } return fragment;}@Overridepublic int getCount() { return resId.length;} }); mCircleIndicator.setViewPager(mViewPager); }

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开发之Drag&Drop框架实现拖放手势

android定时器

一种专用高速硬盘存储设备的设计与实现

局域网中实现linux与Windows文件共享

文件范本

文件范文

android位置传感器

android实习总结报告模板

Android 源代码实例:实现上拉加载下拉刷新浮动效果

linux中利用shell实现批量转换文件编码linux操作系统

Android登陆界面采用文件存储实现(整理6篇)

欢迎下载DOC格式的Android登陆界面采用文件存储实现,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式
点击下载本文文档