Android11-样式和主题、国际化、对话框

1.样式和主题

1:可以在res -> values -> styles.xml中定义公共的样式或者主题。
2:主题作用在整个应用,可以在AndroidManifest.xml的application节点下使用。
<!-- 定义公共的样式 -->
<style name="MyTextView" >
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textColor">#ff0000</item>
    <item name="android:textSize">20sp</item>
    <item name="android:background">#66000000</item>
</style>
<!-- 使用定义的样式 -->
<TextView
          style="@style/MyTextView"
          android:text="hello_world" />
<!-- 定义公共的主题 -->
<style name="MyTheme">
    <item name="android:background">#66000000</item>
</style>
<!-- 使用定义的主题 -->
<application
             android:allowBackup="true"
             android:icon="@drawable/ic_launcher"
             android:label="@string/app_name"
             android:theme="@style/MyTheme" >
</application>

2.国际化

1:在res文件夹下创建values-zh目录,然后编写strings.xml文件,将需要的文件进行翻译之后语言的匹配。
2:在代码中如果涉及字符串内容,使用R.string代替。
3:在布局文件中如果涉及字符串,使用@string/代替。
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">26-------</string>
    <string name="action_settings">设置</string>
    <string name="hello_world">你好</string>

</resources>

<TextView
          style="@style/MyTextView"
          android:text="@string/hello_world" />

3.对话框

public class MainActivity extends Activity {

    private boolean[] checkedItems;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    public void normal(View v){
    	//通过Builder来构建一个对话框
    	Builder builder = new Builder(this);
    	//设置主题
    	builder.setTitle("普通对话框");
    	//设置内容
    	builder.setMessage("丰富多彩的普通对话框的内容");
    	
    	//对话框右边的按钮,第一个参数是按钮的名称,第二个参数可以绑定一个点击事件,选择按钮之后触发
    	builder.setPositiveButton("确定", new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				Toast.makeText(getApplicationContext(), "确定1", Toast.LENGTH_SHORT).show();
			}
		});
    	
		builder.setNegativeButton("取消", new OnClickListener() {
		
			@Override
			public void onClick(DialogInterface dialog, int which) {
				Toast.makeText(getApplicationContext(), "取消1", Toast.LENGTH_SHORT).show();
			}
		});
		
		builder.show();
    }
    
    public void singleChoice(View v){
    	Builder builder = new Builder(this);
    	builder.setTitle("单选");
    	final String[] items = {"11","22","33","44","55"};
    	//第一个参数是一个String类型的数组,第二个参数是被选中选项的索引,-1,没有被选中
    	//第三个参数是选中之后的点击事件
    	builder.setSingleChoiceItems(items, 3, new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				Toast.makeText(getApplicationContext(), items[which], Toast.LENGTH_SHORT).show();
				//选中之后关闭对话框
				dialog.dismiss();
			}
		});
    	builder.show();
    }
    
    public void multiChoice(View v){
    	Builder builder = new Builder(this);
    	builder.setTitle("多选框");
    	//多选框的数据
    	final String[] items = {"111","222","333","444","555"};
    	checkedItems = new boolean[] {true,false,true,false,true};
    	//OnMultiChoiceClickListener被点击(取消或者选中)之后的事件
    	builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which, boolean isChecked) {
				//改变结果数组
				checkedItems[which] = isChecked;
				for(int i = 0;i < items.length;i++){
					if(checkedItems[i]){
						System.out.println("选中" + items[i] + checkedItems[which]);
					}
				}
			}
		});
    	
    	//进行选择完毕时候的操作
    	builder.setPositiveButton("确认", new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				
			}
		});
    	
    	builder.show();
    }

    public void progress(View v){
    	final ProgressDialog progressDialog = new ProgressDialog(this);
    	progressDialog.setTitle("下载数据");
    	//设置进度条的样式
    	progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    	//设置进度条的最大值
    	progressDialog.setMax(100);
    	progressDialog.show();
    	//使用子线程,防止阻塞主线程
    	new Thread(){
    		
    		public void run() {
    			for(int i = 0;i < 100;i++){
    				//设置进度条的进度,进度条可以在子线程中更新UI
    				progressDialog.setProgress(i);
    				//进行延时
    				SystemClock.sleep(100);
    			}
    			
    			progressDialog.show();
    		}
    	}.start();
    }
}

4.关于getApplicationContext()

1:getApplicationContext()可以使用的大多数的地方,但是不能再对话框中使用。因为对话框要显示在当前的activity中,是activity的一部分,而getApplicationContext()是整个应用上下文,所以应该传入当前的activity,因为他不能脱离当前的activity,可传入this。
2:Toast.makeText()方法在使用的使用可以传入getApplicationContext(),因为Toast.makeText()可以理解为一个单独的组件,不用必须游离在当前activity的上方,即他可以脱离当前的activity。

5.Activity

1:Android中每一个页面都是一个Activity。
2:创建Activity的步骤,写一个类继承Activity,重写onCreate()方法。
3:onCreate()方法是Activity创建后调用的第一个方法,在这个方法中可以进行初始化的操作。
4:setContentView(R.layout.activity_main)方法,可以将布局文件转化为view对象并显示。
5:可以使用findViewById(R.id.**),找到相关的组件。
6:加载数据。getCacheDir();获取/data/data/包名/Cache 这个路径。getFilesDir();获取 /data/data/包名/Files这个路径。openFileInput("文件名")操作getFilesDir()目录下的文件,返回一个输入流。openFileOutput("文件名", mode);操作getFilesDir()目录下的文件,返回一个输出流。Environment.getexternalStorageDirectory();获取sd卡路径。

6.xml保存数据

//获取数据
//通过xml保存数据,第一个参数执行文件名,第二个参数是文件的模式
SharedPreferences sp = getSharedPreferences("info", MODE_PRIVATE);
String name = sp.getString("name", "bob");

//设置数据
Editor edit = sp.edit();
edit.putString("name", "bob");
edit.putString("name", "tom");
edit.commit();

7.数据库-SQLite

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

	public MySQLiteOpenHelper(Context context) {
		//第一个参数,上下文环境
		//第二个参数,数据库名成,如果是null,则会在内存中创建一个数据库
		//第三个参数,游标工厂,和ResultSet作用类似,传入null,则会使用默认的游标工厂
		//第四个参数,数据库的版本号
		super(context, "data.db", null, 1);
	}

	/*
	 * (non-Javadoc)
	 * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)
	 * 当数据库第一次被创建的时候,会调用这个方法,进行数据库表的数据化
	 * SQLite的数据库的id使用_id表示
	 * SQLite所存储的数据都是字符串
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table info(_id integer " +
				"primary key autoincrement,name " +
				"varchar(20),phone varchar(20))");
	}

	/*
	 * (non-Javadoc)
	 * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)
	 * 数据库升级只有会走这个方法
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		
	}

	/*
	 * (non-Javadoc)
	 * @see android.database.sqlite.SQLiteOpenHelper#onDowngrade(android.database.sqlite.SQLiteDatabase, int, int)
	 * 数据库降级所调用的方法
	 */
	@Override
	public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		
	}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    MySQLiteOpenHelper myOpenHelper = new MySQLiteOpenHelper(this);
    //getReadableDatabase返回getWritableDatabase获取的数据库,但是如果磁盘满则返回一个只读的数据库
    //如果磁盘满则出现错误
    SQLiteDatabase readableDatabase = myOpenHelper.getReadableDatabase();
    SQLiteDatabase writableDatabase = myOpenHelper.getWritableDatabase();

    //直接操作数据库,没有返回值
    readableDatabase.execSQL("insert into info(name,phone) values('bob','111)");

    //使用谷歌定义的框架操作数据库,有返回值
    ContentValues cv = new ContentValues();
    cv.put("name", "tom");
    long result = readableDatabase.insert("info", "name", cv);

}

8.网络编程

1:不能在主线程中进行联网操作。
2:子线程不能修改UI。
private Handler handler = new Handler(){
		
    public void handleMessage(Message msg) {
        //处理消息
        System.out.println(msg.obj);
    }
};

public void onClick(View v){
    //子线程操作UI
    new Thread(){
        public void run() {
            try {
                URL url = new URL("path");

                connection = (HttpURLConnection)url.openConnection();
                connection.setRequestMethod("GET");
                connection.setConnectTimeout(10000);
                int code = connection.getResponseCode();
                if(code == 200){
                    //通过流,获取相应的内容
                    InputStream inputStream = connection.getInputStream();
                    String data = "数据";
                    //通过Message封装消息
                    Message obtain = Message.obtain();
                    //区分不同的消息
                    obtain.what = 1;
                    //传递数据
                    obtain.obj = data;
                    handler.sendMessage(obtain);
                }
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                connection.disconnect();
            }
        }
    }.start();
}

9.Intent

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //获取打开这个Activity的Intent
    //通过Intent获取数据、设置数据
    Intent intent = getIntent();
    String n = intent.getStringExtra("name");

    intent.putExtra("name", "bob");

}

10.EditText和TextView

1:通过findViewById(R.id.**)获取组件。
2:**.getText().toString();获取组件的内容。
3:**.setText("字符串");为其设置内容。

11.ListView

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ListView listView = (ListView) findViewById(R.id.lv_list);
    //使用定义好的Adapter -> ArrayAdapter,适用于比较简单的布局中
    String[] objects = {"张三","lisi","wangwu","zhaoliu","fengti"};
    //三个参数的ArrayAdapter,布局只能时用TextView,三个参数分别时上下文环境、布局文件资源的id、要显示的数据
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item1, objects);
    //四个参数的ArrayAdapter,可以使用其他组件之外的一个组件
    //四个参数分别时 上下文环境、布局页面资源id、TextwView资源id、内容
    adapter = new ArrayAdapter<String>(this, R.layout.item2, R.id.tv_text, objects);
    listView.setAdapter(adapter);
}

public class MainActivity extends Activity {

    private MyOperHelper myOperHelper;
    private List<Info> list = new ArrayList<Info>();
	private ListView listView;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //获取布局文件
        listView = (ListView) findViewById(R.id.lv_view);
        //数据库的实例
        myOperHelper = new MyOperHelper(this);
    }
    
	/**
	 * 插入数据
	 * @param v
	 */
    public void insert(View v){
    	SQLiteDatabase database = myOperHelper.getReadableDatabase();
    	database.execSQL("insert into info(name,phone) values('王五','13777777')");
    	database.execSQL("insert into info(name,phone) values('zhaoliu','111111')");
    	database.execSQL("insert into info(name,phone) values('tianqi','122222')");
    	database.close();
    }
    
    /**
     * 查询数据,封装List
     * @param v
     */
    public void query(View v){
    	SQLiteDatabase database = myOperHelper.getReadableDatabase();
    	Cursor cursor = database.rawQuery("select * from info", null);
    	while(cursor.moveToNext()){
    		Info info = new Info();
    		info.name = cursor.getString(1);
    		info.phone = cursor.getString(2);
    		list.add(info);
    	}
    	
    	for(Info info : list){
    		System.out.println(info);
    	}
    	
    	//现在有了数据,进行数据于布局文件的适配
    	listView.setAdapter(new MyAdapter());
    }
    
    public class MyAdapter extends BaseAdapter {

    	/**
    	 * 返回数据的总数
    	 */
		@Override
		public int getCount() {
			return list.size();
		}

		/**
		 * 每一个条目所对应的数据
		 */
		@Override
		public Object getItem(int position) {
			return list.get(position);
		}

		/**
		 * 条目数
		 */
		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View view = null;
			if(convertView == null){
				view = View.inflate(MainActivity.this, R.layout.item, null);
			}else {
				view = convertView;
			}
			
			//要通过view对象获取TextView对象,保证TextView是上下翻滚时的最新对象
			TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
			TextView tv_phone = (TextView) view.findViewById(R.id.tb_phone);
			
			//通过position获取List中的数据,并且赋值给TextView
			tv_name.setText(list.get(position).name);
			tv_phone.setText(list.get(position).phone);
			return view;
		}
    	
    }
}

12.打开另一个Activity

public void onClick1(View v){
    Intent intent = new Intent();
    //给意图设置动作
    intent.setAction("com.my.SecondActivity");
    //给意图设置数据
    intent.setData(Uri.parse("tel:" + 111));
    //打开这个Intent描述的Activity
    startActivity(intent);
}

13.打开一个Activity之后,取出数据+返回

public void onClick2(View v){
    Intent intent = new Intent();
    //给意图设置动作
    intent.setAction("com.my.SecondActivity");
    //给意图设置数据
    intent.setData(Uri.parse("tel:" + 111));
    //打开这个Intent描述的Activity,并且完成操作之后返回
    //第二个参数,可以用来区分到底是哪个意图返回的数据
    startActivityForResult(intent, 1);

    //这个方法可以将数据,返回给打开他的那个Activity
    //setResult(1, intent);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值