含有用户界面的JAR制作及其在Android项目中的使用

        在实际的Java开发中,常常遇到要给第三方提供某个操作,但是又不希望第三方了解该操作的具体细节的问题。在众多的处理方法中,JAR(Java Archive,Java 归档文件)是一个不错的选择。

        本文从含有用户界面的JAR制作过程中可能遇到的一些问题和在Android项目中使用JAR的角度做浅显的说明。以下会经常看到两个项目,XJar和XJarTest,前者用于制作JAR和操作验证,后者用于使用和测试JAR的实际效果。


在Eclipse中的项目效果如图:

在两个项目的对应文件夹下的文件名称不能冲突,否则会出现如图所示的错误:

下面演示该错误出现的流程:

1、从XJar项目导出JAR,并确保选择了下图所示路径下的文件;

2、把导出的JAR添加到XJarTest项目(不要忘记Java Build Path哦),此时看到XJarTest项目中对应文件夹下有重名文件;

3、运行,你会看到错误提示!从表面上看,之所以会出现错误提示,是在编译的时候,从XJar项目导出的JAR会和XJarTest中的对应路径下的文件合并,如果重名,编译器无法处理。

 

如何解决在JAR提供的用户界面中使用特定的图片呢?对于这个问题,可以从网络上获得特定的图片,也可以把图片打包到JAR中等。下面对于把图片打包到JAR中做简要说明。

 

把图片放到assets文件夹下,然后把assets打包到JAR中,在JAR中从assets中获得需要使用的图片。

ImageDisplayActivity中的代码如下:

package com.wangliang.jar;

import java.io.IOException;

import android.app.Activity;
import android.content.res.AssetManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;

public class ImageDisplayActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		LinearLayout linearLayout = new LinearLayout(this);
		LayoutParams linearLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
		linearLayout.setLayoutParams(linearLayoutParams);
		linearLayout.setOrientation(LinearLayout.VERTICAL);
		
		TextView textView = new TextView(this);
		LayoutParams textViewParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		textViewParams.gravity = Gravity.CENTER_HORIZONTAL;
		textView.setLayoutParams(textViewParams);
		textView.setText("ImageDisplayActivity!:)");
		
		ImageView imageView = new ImageView(this);
		LayoutParams imageViewParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		imageViewParams.gravity = Gravity.CENTER_HORIZONTAL;
		imageView.setLayoutParams(imageViewParams);
		AssetManager assetManager = getAssets();
		try {
			Drawable drawable = Drawable.createFromStream(assetManager.open("box_gray.png"), null);
			imageView.setImageDrawable(drawable);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		linearLayout.addView(textView);
		linearLayout.addView(imageView);
		
		setContentView(linearLayout);
		
	}
	
}

 运行效果如下:


从XJar项目导出JAR,然后添加到XJarTest项目中,注意在Manifest.xml文件中添加Activity的声明,如下:

<activity android:name="com.wangliang.jar.ImageDisplayActivity"></activity>

 然后运行,效果如下图:


也许你会提出疑问:XJarTest项目在assets文件夹下的图片可以是任意名称的,而且不知道XJar项目的assets文件夹中的内容,那么,重名的可能性还是会存在!我们可以通过在XJar中创建多级文件夹来保存需要使用的图片,这样可以降低这种可能性。

当然,也可以把图片资源放到和类文件同级的文件夹内,如图:

此时获得图片的代码要做调整,如下是一种可行性的调整:

Drawable drawable = Drawable.createFromStream(getClass().getResourceAsStream("/com/wangliang/jar/box_blue.png"), null);

 在XJarTest中运行的效果如图:


《测试代码》

猜你喜欢

转载自wangleyiang.iteye.com/blog/1705932
今日推荐