Android Assets 디 렉 터 리 에 Xml 레이아웃 파일 불 러 오기

4087 단어 AndroidAssetsXml
최근 프로젝트 개발 로 동적 레이아웃 을 사 용 했 습 니 다.sdk 를 포장 하기 때문에 sdk 라 는 activity 는 layot 파일 이 필요 합 니 다.sdk 개발 을 한 파트너 는 layot 파일 을 jar 에 포장 할 수 없다 는 것 을 알 아야 합 니 다.그럼요.프로젝트 가 jar 가방 을 사용 하기 때문에 layot 파일 을 어떻게 해결 하 느 냐 가 문제 입 니 다.처음에 생각 한 방법 은 layot 파일 을 고객 에 게 보 내 는 것 입 니 다.그러나 이런 방법 은 분명히 적합 하지 않다 는 것 을 알 게 되 었 다.나중에 안 드 로 이 드 는 xml 레이아웃 파일 을 불 러 올 수 있 는 방법 을 제공 했다.바로 inflate(XmlPull Parser parser,View Group root)라 는 방법 을 사용 했다.인터넷 에서 많은 글 을 찾 았 는데 그 중에서 이 해석 과정 을 간단하게 묘 사 했 지만 사용 과정 에서 몇 가지 문제 가 발생 했다.
1.XmlPullParser 대상 을 어떻게 얻 습 니까?
이 상 대 를 얻 는 것 은 어렵 지 않 습 니 다.AssetsManger 를 통 해 XmlResourceParser openXmlResourceParser(String fileName)를 쉽게 얻 을 수 있 습 니 다.
하지만 여기 서 문제 가 있 습 니 다.filename 에"assets\"접 두 사 를 붙 여야 합 니 다.그렇지 않 으 면 FileNotFound 이상 을 알 릴 수 있 습 니 다.
2 xml 레이아웃 파일 을 처리 할 수 없 음 발견
openxml resourceparser 방법 이 잘못 되 었 습 니 다.왜 일 까요?자 료 를 찾 은 것 은 이 방법 이 컴 파일 된 xml 파일 만 해석 할 수 있 기 때 문 입 니 다.그러면 컴 파일 된 xml 파일 은 생 성 된 apk 압축 을 풀 고 받 은 xml 이 컴 파일 된 것 입 니 다.그래서 우리 가 assets 에 넣 은 xml 는 모두 컴 파일 된 파일 입 니 다.아직 안 드 로 이 드 를 찾 지 못 했 습 니 다.xml 파일 을 전문 적 으로 컴 파일 할 수 있 는 다른 도구 가 있 습 니 다.
3.view 를 분 석 했 습 니 다.안에 있 는 하위 view 를 어떻게 가 져 오 는 지 id 를 통 해 안 됩 니 다.
이것 은 확실 합 니 다.layot 폴 더 에 있 는 것 이 아니 라 id 색인 이 없 기 때문에 id 를 통 해 find 할 수 없습니다.그러면 하위 view 를 어떻게 얻 었 는 지 알 게 되 었 습 니 다.이 문 제 를 해결 하 는 사람 이 있 습 니 다.바로 findView WithTag 라 는 방법 으로 xml view 에서 설정 한 tag 를 통 해 얻 을 수 있 습 니 다.
이상 의 문제 가 해결 되면 xml 레이아웃 view 파일 을 완벽 하 게 가 져 와 activity 에 동적 으로 설정 할 수 있 습 니 다.다음은 제 가 소스 코드 를 붙 여 드릴 게 요.필요 한 친 구 는 참고 하 세 요.

import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.XmlResourceParser;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by yuge on 2017/11/8.
 */

public class AssetsViewHelper {
 private static Context mcontext;
 private static AssetsViewHelper assetsViewHelper;
 /**
  * assets     
  */
 private static String assetsFile="assets/";
 private AssetsViewHelper(){
 }


 public static AssetsViewHelper width(Context context){
  mcontext=context.getApplicationContext();
  if(assetsViewHelper==null){
    synchronized (AssetsViewHelper.class){
     if(assetsViewHelper==null){
      assetsViewHelper=new AssetsViewHelper();
     }
    }
  }
  return assetsViewHelper;
 }

 /**
  *   layout  
  * @param filename
  * @return
  */
 public View getAssetsLayout(String filename) {
  AssetManager am = mcontext.getResources().getAssets();
  try {
    XmlResourceParser parser = am.openXmlResourceParser(assetsFile + "activity_main.xml");
    LayoutInflater inflater = (LayoutInflater) mcontext.getSystemService(mcontext.LAYOUT_INFLATER_SERVICE);
    View inflate = inflater.inflate(parser, null);
    return inflate;
   } catch (IOException e) {
    e.printStackTrace();
    return null;
   }
 }
  /**
   *    tag    view   
   * @param viewGroup       activity    
   * @param tag
   * @return
   */
 public View getViewByTag(View viewGroup,Object tag){
  return viewGroup.findViewWithTag(object);
 }

 /**
  *   assets       
  * @param fileName
  * @return
  */
  Bitmap getImageFromAssetsFile(String fileName)
 {
  Bitmap image = null;
  AssetManager am = mcontext.getResources().getAssets();
  try
  {
   InputStream is = am.open(assetsFile+fileName);
   image = BitmapFactory.decodeStream(is);
   is.close();
  }
  catch (IOException e)
  {
   e.printStackTrace();
  }

  return image;

 }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기