当前位置:  编程技术>移动开发
本页文章导读:
    ▪FragmentTransaction的小疑点        FragmentTransaction的小问题 FragmentTransaction有三个add方法分别是add(int containerViewId, Fragment fragment)Calls add(int, Fragment, String) with a null tag.add(Fragment fragment, String tag)Calls add(int, Fragment, String) with a 0 c.........
    ▪ NSAttributedString使用引见        NSAttributedString使用介绍 NSMutableAttributedString *attriString = [[[NSMutableAttributedString alloc] initWithString:@"this is test!"]                                                  au.........
    ▪ [有源码]ViewPager+Fragment+RadioButton顶替TabActivity       [有源码]ViewPager+Fragment+RadioButton替代TabActivitypackage cn.com.jdsc; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeLi.........

[1]FragmentTransaction的小疑点
    来源: 互联网  发布时间: 2014-02-18
FragmentTransaction的小问题
FragmentTransaction有三个add方法
分别是
add(int containerViewId, Fragment fragment)
Calls add(int, Fragment, String) with a null tag.

add(Fragment fragment, String tag)
Calls add(int, Fragment, String) with a 0 containerViewId.

add(int containerViewId, Fragment fragment, String tag)
Add a fragment to the activity state.

如果想把一个带有UI的Fragment添加到当前的Activity里面,需要使用add(int containerViewId, Fragment fragment)或者 add(int containerViewId, Fragment fragment, String tag)这两个方法,containerViewId一定是fragment的容器视图的id,而非是fragment的id,也就是说 这个id如果通过 FragmentManager.findFragmentById()是找不到的,只有通过FragmentManager.findFragmentByTag 设定的Tag才能找到的。

    
[2] NSAttributedString使用引见
    来源: 互联网  发布时间: 2014-02-18
NSAttributedString使用介绍

首先导入CoreText.framework,并在需要使用的文件中导入:

#import<CoreText/CoreText.h>

创建一个NSMutableAttributedString:

  • NSMutableAttributedString *attriString = [[[NSMutableAttributedString alloc] initWithString:@"this is test!"]   
  •                                               autorelease];  
  • 非常常规的创建方式,接下来我们给它配置属性:

  • //把this的字体颜色变为红色  
  • [attriString addAttribute:(NSString *)kCTForegroundColorAttributeName  
  •                     value:(id)[UIColor redColor].CGColor   
  •                     range:NSMakeRange(0, 4)];  
  • //把is变为黄色  
  • [attriString addAttribute:(NSString *)kCTForegroundColorAttributeName  
  •                     value:(id)[UIColor yellowColor].CGColor   
  •                     range:NSMakeRange(5, 2)];  
  • //改变this的字体,value必须是一个CTFontRef  
  • [attriString addAttribute:(NSString *)kCTFontAttributeName  
  •                     value:(id)CTFontCreateWithName((CFStringRef)[UIFont boldSystemFontOfSize:14].fontName,  
  •                                                    14,   
  •                                                    NULL)  
  •                     range:NSMakeRange(0, 4)];  
  • //给this加上下划线,value可以在指定的枚举中选择  
  • [attriString addAttribute:(NSString *)kCTUnderlineStyleAttributeName  
  •                     value:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble]  
  •                     range:NSMakeRange(0, 4)];  
  • return attriString;  
  • 这样就算是配置好了,但是我们可以发现NSAttributedString继承于NSObject,并且不支持任何draw的方法,那我们就只能自己draw了。写一个UIView的子类(假设命名为TView),在initWithFrame中把背景色设为透明(self.backgroundColor = [UIColor clearColor]),然后在重写drawRect方法:

  • -(void)drawRect:(CGRect)rect{  
  •     [super drawRect:rect];  
  •       
  •     NSAttributedString *attriString = getAttributedString();  
  •       
  •     CGContextRef ctx = UIGraphicsGetCurrentContext();  
  •     CGContextConcatCTM(ctx, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, rect.size.height), 1.f, -1.f));  
  •       
  •     CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attriString);  
  •     CGMutablePathRef path = CGPathCreateMutable();  
  •     CGPathAddRect(path, NULL, rect);  
  •       
  •     CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);  
  •     CFRelease(path);  
  •     CFRelease(framesetter);  
  •       
  •     CTFrameDraw(frame, ctx);  
  •     CFRelease(frame);  
  • }  
  • 在代码中我们调整了CTM(current transformation matrix),这是因为Quartz 2D的坐标系统不同,比如(10, 10)到(20, 20)的直线坐标:

     

    坐标类似于数学中的坐标,可以先不调整CTM,看它是什么样子的,下面两种调整方法是完全一样的:

  • CGContextConcatCTM(ctx, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, rect.size.height), 1.f, -1.f));  
  • ==

  • CGContextTranslateCTM(ctx, 0, rect.size.height);  
  • CGContextScaleCTM(ctx, 1, -1);  
  • CTFramesetter是CTFrame的创建工厂,NSAttributedString需要通过CTFrame绘制到界面上,得到CTFramesetter后,创建path(绘制路径),然后得到CTFrame,最后通过CTFrameDraw方法绘制到界面上。

    如果想要计算NSAttributedString所要的size,就需要用到这个API:

    CTFramesetterSuggestFrameSizeWithConstraints,用NSString的sizeWithFont算多行时会算不准的,因为在CoreText里,行间距也是你来控制的。

    设置行间距和换行模式都是设置一个属性:kCTParagraphStyleAttributeName,这个属性里面又分为很多子

    属性,其中就包括

    • kCTLineBreakByCharWrapping
    • kCTParagraphStyleSpecifierLineSpacingAdjustment
    设置如下:
  • //段落  
  •     //line break  
  • CTParagraphStyleSetting lineBreakMode;  
  • CTLineBreakMode lineBreak = kCTLineBreakByCharWrapping; //换行模式  
  • lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;  
  • lineBreakMode.value = &lineBreak;  
  • lineBreakMode.valueSize = sizeof(CTLineBreakMode);  
  •     //行间距  
  • CTParagraphStyleSetting LineSpacing;  
  • CGFloat spacing = 4.0;  //指定间距  
  • LineSpacing.spec = kCTParagraphStyleSpecifierLineSpacingAdjustment;  
  • LineSpacing.value = &spacing;  
  • LineSpacing.valueSize = sizeof(CGFloat);  
  •   
  • CTParagraphStyleSetting settings[] = {lineBreakMode,LineSpacing};  
  • CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, 2);   //第二个参数为settings的长度  
  • [attributedString addAttribute:(NSString *)kCTParagraphStyleAttributeName  
  •                          value:(id)paragraphStyle  
  •                          range:NSMakeRange(0, attributedString.length)];  
  • -----------------------------------------猥琐的分界线-----------------------------------------

    这并不是唯一的方法,还有另一种替代方案:

  • CATextLayer *textLayer = [CATextLayer layer];  
  • textLayer.string = getAttributedString();  
  • textLayer.frame = CGRectMake(0, CGRectGetMaxY(view.frame), 200, 200);  
  • [self.view.layer addSublayer:textLayer];  
  • CATextLayer可以直接支持NSAttributedString!

    -----------------------------------------猥琐的分界线-----------------------------------------

    效果图:



        
    [3] [有源码]ViewPager+Fragment+RadioButton顶替TabActivity
        来源: 互联网  发布时间: 2014-02-18
    [有源码]ViewPager+Fragment+RadioButton替代TabActivity
    package cn.com.jdsc;
    
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.view.ViewPager;
    import android.support.v4.view.ViewPager.OnPageChangeListener;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.RadioButton;
    
    public class MainActivity extends FragmentActivity implements OnClickListener{
    	public static final int TAB_HOME = 0;
    	public static final int TAB_CATAGORY = 1;
    	public static final int TAB_CAR = 2;
    	public static final int TAB_BUY = 3;
    	public static final int TAB_MORE = 4;
    
    	private ViewPager viewPager;
    	private RadioButton main_tab_home, main_tab_catagory, main_tab_car,
    			main_tab_buy, main_tab_more;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.fragmentmain);
    		initView();
    		addListener();
    	}
    
    	private void initView() {
    		viewPager = (ViewPager) findViewById(R.id.viewpager);
    		main_tab_home = (RadioButton) findViewById(R.id.main_tab_home);
    		main_tab_catagory = (RadioButton) findViewById(R.id.main_tab_catagory);
    		main_tab_car = (RadioButton) findViewById(R.id.main_tab_car);
    		main_tab_buy = (RadioButton) findViewById(R.id.main_tab_buy);
    		main_tab_more = (RadioButton) findViewById(R.id.main_tab_more);
    		main_tab_home.setOnClickListener(this);
    		main_tab_catagory.setOnClickListener(this);
    		main_tab_car.setOnClickListener(this);
    		main_tab_buy.setOnClickListener(this);
    		main_tab_more.setOnClickListener(this);
    		
    		FragmentAdapter adapter = new FragmentAdapter(
    				getSupportFragmentManager());
    		viewPager.setAdapter(adapter);
    	}
    
    	private void addListener() {
    		viewPager.setOnPageChangeListener(new OnPageChangeListener() {
    
    			@Override
    			public void onPageSelected(int id) {
    				switch (id) {
    				case TAB_HOME:
    					main_tab_home.setChecked(true);
    					break;
    				case TAB_CATAGORY:
    					main_tab_catagory.setChecked(true);
    					break;
    				case TAB_CAR:
    					main_tab_car.setChecked(true);
    					break;
    				case TAB_BUY:
    					main_tab_buy.setChecked(true);
    					break;
    				case TAB_MORE:
    					main_tab_more.setChecked(true);
    					break;
    
    				default:
    					break;
    				}
    			}
    
    			@Override
    			public void onPageScrolled(int arg0, float arg1, int arg2) {
    
    			}
    
    			@Override
    			public void onPageScrollStateChanged(int arg0) {
    
    			}
    		});
    	}
    
    	@Override
    	public void onClick(View v) {
    		switch (v.getId()) {
    		case R.id.main_tab_home:
    			viewPager.setCurrentItem(TAB_HOME);
    			break;
    		case R.id.main_tab_catagory:
    			viewPager.setCurrentItem(TAB_CATAGORY);
    			break;
    		case R.id.main_tab_car:
    			viewPager.setCurrentItem(TAB_CAR);
    			break;
    		case R.id.main_tab_buy:
    			viewPager.setCurrentItem(TAB_BUY);
    			break;
    		case R.id.main_tab_more:
    			viewPager.setCurrentItem(TAB_MORE);
    			break;
    
    		default:
    			break;
    		}		
    	}
    }
    

    各个Fragment

    package cn.com.jdsc;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class HomeFragment extends Fragment	{
    	@Override
    	public View onCreateView(LayoutInflater inflater, ViewGroup container,
    			Bundle savedInstanceState) {
    		System.out.println("HomeFragment");
    		return inflater.inflate(R.layout.main_home, container, false);
    	}
    }
    




    下载地址:http://download.csdn.net/detail/qq634416025/6392371


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3