android選擇文件
A. android自定義控制項之文件選擇
不多說,先上圖:
列舉當前目錄下的所有文件,如果是選擇目錄,則不顯示文件,如果是選擇文件,則需要顯示文件。
新建目錄,就是在當前路徑下新建目錄,同時新建後的目錄要能夠及時顯示在文件列表中。
需要讀寫許可權,添加第三方許可權請求庫:
使用:
DialogFragment與Dialog有一些不同的地方,其中show方法需要傳入FragmentManager
另外需在onCreateVie方法初始化布局,以及獲取到控制項
另外就是RecycleView,之所以採用RecycleView,是因為發現如果用ListView,內存會不斷增加,很難降下來。
其中CommonAdapter繼承自BaseAdapter,是通用的Adapter,兼容ListView:
這一部分邏輯有FileProvider類完成; 這里需要注意的是,有些手機不支持讀取根目錄,所以改為讀取"/mnt/"作為根目錄就行讀取。
另外跳轉目錄都是改變當前路徑,然後再刷新數據。
同時在其內部定義了FileData類:
文件選擇,可以通過當前路徑路徑以及列表索引來唯一確定路徑;都是,當跳轉目錄後,索引應該重置。
這里採用WeakReference記錄選擇的控制項,但選擇其他目錄或者文件時,之前的控制項需要重置一下狀態。
https://github.com/xiaoyifan6/videocreator
該源碼主要用於圖片合成gif或者視頻,其中文件選擇彈窗是自己寫的。感覺這個彈出應該有許多地方可以用到,所以寫下這篇文章,方便以後參考查看。
B. Android編程 打開本地文件 文件選擇器
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/b01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<ImageView
android:id="@+id/iv01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
代碼
java">import java.io.FileNotFoundException;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class Lesson_01_Pic extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button)findViewById(R.id.b01);
button.setText("選擇圖片");
button.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent();
/* 開啟Pictures畫面Type設定為image */
intent.setType("image/*");
/* 使用Intent.ACTION_GET_CONTENT這個Action */
intent.setAction(Intent.ACTION_GET_CONTENT);
/* 取得相片後返回本畫面 */
startActivityForResult(intent, 1);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
Log.e("uri", uri.toString());
ContentResolver cr = this.getContentResolver();
try {
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
ImageView imageView = (ImageView) findViewById(R.id.iv01);
/* 將Bitmap設定到ImageView */
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
Log.e("Exception", e.getMessage(),e);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
C. android中怎樣自由選擇文件保存路徑
獲取SD卡許可權 然後通過獲取SD卡目錄 再通過流寫入文件就可以了
D. android選擇本地文件的問題
網路錯誤,你肯定選擇成網路圖片,不然為什麼與網路相關呢?
抓一下log看一下運行流程,也可能調用了其他不相關的內容了。
到sd卡內目測一下那兩張圖片,將其移動到可以正常顯示的圖片目錄下進一步測試。
E. android 有沒有文件選擇對話框
// filename: CallbackBundle.java
package com.example.openfiledemo;
import android.os.Bundle;
// 簡單的Bundle參數回調介面
public interface CallbackBundle {
abstract void callback(Bundle bundle);
}
[java] view plain
// filename: CallbackBundle.java
package com.example.openfiledemo;
import android.os.Bundle;
// 簡單的Bundle參數回調介面
public interface CallbackBundle {
abstract void callback(Bundle bundle);
}
然後的打開文件對話框的一下封裝:
SimpleAdapter adapter = new SimpleAdapter(getContext(), list, R.layout.filedialogitem, new String[]{"img", "name", "path"}, new int[]{R.id.filedialogitem_img, R.id.filedialogitem_name, R.id.filedialogitem_path});
this.setAdapter(adapter);
return files.length;
}
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
// 條目選擇
String pt = (String) list.get(position).get("path");
String fn = (String) list.get(position).get("name");
if(fn.equals(sRoot) || fn.equals(sParent)){
// 如果是更目錄或者上一層
File fl = new File(pt);
String ppt = fl.getParent();
if(ppt != null){
// 返回上一層
path = ppt;
}
else{
// 返回更目錄
path = sRoot;
}
}
else{
File fl = new File(pt);
if(fl.isFile()){
// 如果是文件
((Activity)getContext()).dismissDialog(this.dialogid); // 讓文件夾對話框消失
// 設置回調的返回值
Bundle bundle = new Bundle();
bundle.putString("path", pt);
bundle.putString("name", fn);
// 調用事先設置的回調函數
this.callback.callback(bundle);
return;
}
else if(fl.isDirectory()){
// 如果是文件夾
// 那麼進入選中的文件夾
path = pt;
}
}
this.refreshFileList();
}
}
}
[java] view plain
// filename: OpenFileDialog.java
package com.example.openfiledemo;
SimpleAdapter adapter = new SimpleAdapter(getContext(), list, R.layout.filedialogitem, new String[]{"img", "name", "path"}, new int[]{R.id.filedialogitem_img, R.id.filedialogitem_name, R.id.filedialogitem_path});
this.setAdapter(adapter);
return files.length;
}
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
// 條目選擇
String pt = (String) list.get(position).get("path");
String fn = (String) list.get(position).get("name");
if(fn.equals(sRoot) || fn.equals(sParent)){
// 如果是更目錄或者上一層
File fl = new File(pt);
String ppt = fl.getParent();
if(ppt != null){
// 返回上一層
path = ppt;
}
else{
// 返回更目錄
path = sRoot;
}
}
else{
File fl = new File(pt);
if(fl.isFile()){
// 如果是文件
((Activity)getContext()).dismissDialog(this.dialogid); // 讓文件夾對話框消失
// 設置回調的返回值
Bundle bundle = new Bundle();
bundle.putString("path", pt);
bundle.putString("name", fn);
// 調用事先設置的回調函數
this.callback.callback(bundle);
return;
}
else if(fl.isDirectory()){
// 如果是文件夾
// 那麼進入選中的文件夾
path = pt;
}
}
this.refreshFileList();
}
}
}
F. Android中selector使用詳解
選擇器在android中使用的非常廣泛,點擊反饋、選中、使能、聚焦等狀態切換都會用到選擇器。
一:下面是一個簡單的選擇器:
android:enterFadeDuration="200" 、android:exitFadeDuration="200":進入新狀態或退出舊狀態時會有一個200毫秒的漸變動畫。這兩個屬性使用的比較常見,可以使選擇器的狀態切換更加平滑。
以下幾個都是Drawable的屬性。
android:autoMirrored="true"對應drawable.setAutoMirrored(),這個屬性表示是否將drawable鏡像顯示,只有在從右往左布局的環境下才會生效。將此屬性設置成true,並將語言調節成阿拉伯語便可以看到效果。
android:dither="true"對應drawable.setDither(),這個屬性表示是否對圖像進行抖動處理。當圖像的bit-color較少時,通過顏色值的抖動來增加可用顏色數量,並保持較好的顯示效果。
android:visible="true" 對應drawable.setVisible(),設置Drawable是否可見,一般不會影響Drawable的行為,但是它是Drawable是否運行了動畫的一個暗示。例如:AnimationDrawable可以通過這個方法啟動或者停止動畫。
剩下兩個屬性對應DrawableContainer$DrawableContainerState裡面的屬性(DrawableContainer是Drawable的一個子類,DrawableContainerState是DrawableContainer的內部類)。
android:constantSize="true":當選擇器各個狀態的圖片大小不一時,設置為 true表示以最大的圖片的尺寸顯示,設置為false以默認的圖片的尺寸顯示(控制項大小會對現象有影響,需要是包裹內容的)。
android:variablePadding="false" :默認為false,這個屬性意義不大,通常不去設置。
二:Item的各種狀態,理解起來相對簡單,都可以從屬性的名字去理解其含義,例如:
狀態為加速的時候會顯示ic_launcher_m圖片,那麼是什麼加速呢?這就需要自己去分析一下,其實這里指的加速是對View的軟體加速或硬體加速。
當給View設置background、foreground或ImageView設置src時只能寫android:drawable="id":
當給文字顏色添加選擇器的時候必須要寫android:color="ARGB|RGB顏色值"
三:注意安卓程序在讀取選擇器文件時,是從上往下一個一個節點進行遍歷的,程序會選擇符合當前控制項狀態的第一個Item的內容。如果一個Item不寫任何狀態,表示它任何狀態都符合, 所以一般最後一個Item是不會寫任何狀態的(就像if(){}else if(){}else{}語句一樣,最後一個包含了剩下的所有情況)。
四:選擇器的Item和animated-rotate一起使用。
五:動態創建選擇器
動態創建一個簡單的選擇器:
用一張圖片,通過對圖片的著色創建選擇器:
創建矢量圖選擇器:
TextView文字顏色選擇器:
部分常用狀態數組:
G. 關於android怎麼動態調用資源文件使根據不同的情況選擇不同的資源文件
android ndk下面生成動態庫so文件的方法很多,但是這里只提供一種方法,更多的生成方法可以看,「ndk 編譯靜態庫」:
http://jingyan..com/article/63f236280b90690208ab3d12.html
2
fkAdd.c 的內容如下:
#include <jni.h>
int fkAdd(int nX, int nY)
{
return nX + nY;
}
3
Android.mk 的內容如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= fkAdd
LOCAL_SRC_FILES:= fkAdd.c
include $(BUILD_SHRRED_LIBRARY)
1、打開 eclipse
2、點擊 文件
3、點擊 新建
4、點擊 other...
1、展開 Android 選項;
2、選擇 Android Project from Existing Code;
3、點擊 Next
1、輸入 Root Director;
2、取消 tests;
3、選中 Copy projects into workspace;
4、點擊 Finish;
1、右鍵工程;
2、選擇 Android Tools;
3、Add Native Support...;
點擊 Finish
修改android sdk 版本為 4.0.3;
關於如何修改 android sdk 版本:
http://jingyan..com/article/c910274bfdd000cd371d2d4b.html
修改 Min SDK version:15
修改 Target SDK version:19
在jni目錄下面新建文件fkAdd.c 的內容如下:
int fkAdd(int nX, int nY)
{
return nX + nY;
}
臨時修改 Android.mk 文件內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#LOCAL_MODULE := hello-jni
#LOCAL_SRC_FILES := hello-jni.c
LOCAL_MODULE := fkaddso
LOCAL_SRC_FILES := fkAdd.c
include $(BUILD_SHARED_LIBRARY)
使用快捷鍵Ctrl+B編譯後可以在libs目錄下面看到生成的一些列的
libfkaddso.so文件,如下圖所示
H. android 文件選擇
privatevoidopenFileBrowse(){
Intentintent=newIntent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");//文件類型
IntentwrapperIntent=Intent.createChooser(intent,"打開方式");
startActivityForResult(wrapperIntent,0);
}
protectedvoidonActivityResult(intrequestCode,intresultCode,
Intentintent){
//Stringpath;
if(resultCode==RESULT_OK){
if(requestCode==0){
if(intent==null){
Toast.makeText(this,"未選擇任何文件",Toast.LENGTH_LONG).show();
return;
}
Uriuri=intent.getData();
if(uri==null){
Toast.makeText(this,"未選擇任何文件",Toast.LENGTH_LONG).show();
return;
}
Stringscheme=uri.getScheme();
//可能是content,file等等.需要判斷其是不是file
如果不是調用文件管理器,可能返回其他
if(scheme!=null
&&("file".endsWith(scheme.toLowerCase()))
Stringpath=uri.getPath();//文件路徑
}
}
}
I. android是根據什麼去選擇三種drawable文件夾下的圖片
是根據drawable文件夾的修飾符進行選擇的。
比如drawable、drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawalbe-xxhdpi、drawable-xxxhdpi
根據修飾符進行優先匹配。
不同的dpi修飾符對應的dpi如下
drawable-ldpi 120DPI
drawable-mdpi 160DPI
drawable-hdpi 240DPI
drawable-xhdpi 320DPI
drawalbe-xxhdpi 480DPI
drawable-xxxhdpi 640DPI
dpi是根據手機的當前解析度ppi歸一化得到的。
那麼PPI如何得來的?
如果手機的寬為X,高為Y,屏幕大小為Z英寸,那麼
公式中的X2其實是X的平方,即X*X。
比如三星手機I9260解析度是1280*720,屏幕大小是4.65英寸,那麼計算得到的PPI就是315.8PPI
找一個最近的DPI值應該是320DPI,也就是這個設備被歸一化後就是320DPI。屬於xhdpi。
系統取圖片時會優先選擇drawable-xhdpi裡面的圖片,如果drawable-xhdpi不存在或者沒有這張圖,就會就近從其它解析度和默認的無後綴drawable文件夾下取。
比如工程只有在draw-xxhdpi文件下有img圖片,而你的設置是xhdpi,就會從xxhdpi取完圖片再壓縮到對應大小返回給使用者。