apkplug 테마 스킨 전환의 사용자 정의 스타일 - 05

이 문서는 apkplug V1.6.9 설명
apkplug 사용자 정의 스타일 전환
apkplug 테마 전환은 두 개의 차원을 포함합니다
    1.공통 테마, 시스템 테마와 유사
    2.사용자 정의 컨트롤 스타일 전환
지난 글에서 설명한 바와 같이 우리는 유니버설 주제가 한계가 있다는 것을 판정할 수 있다. 많은 상황에서 우리가 필요로 하는 것은 우리의 응용 능력과 결합된 사용자 정의 컨트롤 양식이다.QQ 채팅 메시지
QQ스킨, QQ채팅 거품 등.이러한 상황에 맞추어 우리는 apkplug를 위해 개발자의 이 방면의 수요를 만족시키기 위해 인터페이스를 새로 설계했다.
 
2 사용자 정의 컨트롤 스타일 전환
사용자 정의 컨트롤 스타일은 말 그대로 우리 개발자가 요구하는 사용자 정의이다. 개발된 응용 자체와 관련이 있기 때문에 서로 다른 응용은 서로 다른 디자인 요구와 형식을 가진다.그래서 미리 정의를 내릴 수 있는 게 아니야.
 
세 가지 정의 사용자 정의 컨트롤 스타일 교체 인터페이스
apkplug의 요구에 따라 개발자가 일부 사용자 정의 컨트롤의 스타일을 바꾸려면 미리 교체 인터페이스(템플릿)를 정의해야 한다. 테마 패키지는 이 템플릿에 따라 해당하는 스타일 ID를 채워서 메인 응용 프로그램에 전달할 수 있다.그러나 apkplug에서 템플릿의 정의 형식을 요구하지 않았습니다. 이 템플릿은 다음과 같이 자바인터페이스가 되어야 합니다.
public interface chatstyles {
	//            0      
	//      ,                   
	public int Version();
	//      Item     
	public int chat_right_msg_background();
	//      Item     
	public int chat_left_msg_background();
	//      
	public int chatbackground();
}

넷째, 테마 패키지에 사용할 템플릿을jar 패키지로 내보냅니다
다섯 가지 테마 패키지가 템플릿을 채워서 메인 응용 프로그램에 전달
    1.테마 패키지 외부 가져오기 템플릿jar 패키지 (osgi.jar 패키지 유사)
 
    2.템플릿 채우기
public class chatstylesImp implements chatstyles{
	@Override
	public int chat_left_msg_background() {
		return R.drawable.chat_btn_left;
	}
	@Override
	public int chat_right_msg_background() {
		return R.drawable.chat_btn_right;
	}
	@Override
	public int Version() {
		return 0;
	}
	@Override
	public int chatbackground() {
		return R.drawable.menu_background;
	}
}

    3.템플릿을 apkplug에 등록해서 나중에 주 응용 프로그램에서 인용될 수 있도록 합니다
    
OSGIServiceAgent<ThemeControl> agent=new OSGIServiceAgent<ThemeControl>(mcontext,ThemeControl.class.getName());
//         
agent.getService().addStyles(mcontext, chatstyles.class.getName(), 
					new chatstylesImp()); 
//      
agent.getService().setTheme(mcontext,mcontext.getBundle(), R.style.AppTheme_Another);

주: 여기에 작은 점이 하나 있는데 주의해야 할 것은 유니버설 스타일 전환이 이 테마 패키지의 사용자 정의 컨트롤 스타일로 설정되어야만 적용됩니다
4. 주 응용 프로그램은 인터페이스를 그릴 때 바꿀 수 있는 테마 스타일을 판단합니까?
테마 패키지가 언제 테마 교체 스타일을 제공할 수 있는지 모르기 때문에 UI를 만들 때 템플릿을 판단하고, 템플릿의 스타일 ID로 대응하는 UI 컨트롤에 설정하고, 없으면 기본값을 사용합니다.그래서 테마 스타일 전환은 Activity를 새로 고쳐야 합니다.
apkplug v1.6.9 org.apkplug.Bundle.ThemeAgent 클래스, 템플릿 변경 상태를 자동으로 감지할 수 있습니다.
ThemeAgent<chatstyles> ta=new ThemeAgent<chatstyles>(mcontext,chatstyles.class);
chatstyles ct=ta.getService();
if(ct!=null){
	//                
}else{
	//            
}
사용자 정의 UI 컨트롤 교체 스타일 코드 예
chatstyles cs=ThemeChengFactory.getInstance(null).getService();
if(cs!=null){
	ViewHolder v= (ViewHolder)convertView.getTag();
	if(isComMsg){
	    if(cs.chat_left_msg_background()!=-1){
	    	v.tvContent.setBackgroundResource(cs.chat_left_msg_background());
	    }
	}else{
	    if(cs.chat_right_msg_background()!=-1){
		v.tvContent.setBackgroundResource(cs.chat_right_msg_background());
	    }
	}
}

5. 메인 응용 프로그램에서 테마 패키지가 전환 스타일을 제공하고 인터페이스를 다시 그리는 것을 어떻게 알았습니까?
스타일은 언제든지 전환되며, 네트워크 아래 테마 패키지를 통해 동적으로 전환할 수 있습니다.따라서 기본 애플리케이션에서 적절한 UI 스타일 전환을 판단하는 메커니즘이 필요합니다.현재 apkplug 테마 전환 스타일은Activity 리셋이 필요합니다. 테마 전환 이벤트를 감청하고 적절한 시기에 리셋을 다시 시작합니다.
BundleContext context=frame.getSystemBundleContext();
//RegThemeChengeListener     
OSGIServiceAgent<RegThemeChengeListener> agent=new OSGIServiceAgent<RegThemeChengeListener>
(context,RegThemeChengeListener.class.getName());
final RegThemeChengeListener service=agent.getService();
//       1(   )                 
service.registerOnThemeListener(
    new OnThemeChengeListener(){
	@SuppressLint("NewApi")
	@Override
	public void afterChenged(
	org.osgi.framework.Bundle arg0, int arg1) {
		//         
		MainActivity.this.recreate();
	//         ,             
		service.unregisterOnThemeListener(this);
	}
	@Override
	public void beforeChenge(
	org.osgi.framework.Bundle bb, int arg1,org.osgi.framework.Bundle tob, int arg2) {
								
	}
    });

좋은 웹페이지 즐겨찾기