2013-08-07 28 views
0

我更新的代碼爲公司應用程序,並有大約20活動課,所有下載一個PDF,然後使用此代碼顯示它:如何使用實用工具類來啓動意圖的Android

public void showPdf() 
{ 
    File file = new File(Environment.getExternalStorageDirectory()+"/pdf/Read.pdf"); 
    PackageManager packageManager = getPackageManager(); 
    Intent testIntent = new Intent(Intent.ACTION_VIEW); 
    testIntent.setType("application/pdf"); 
    List list = packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY); 
    Intent intent = new Intent(); 
    intent.setAction(Intent.ACTION_VIEW); 
    Uri uri = Uri.fromFile(file); 
    intent.setDataAndType(uri, "application/pdf"); 
    startActivity(intent); 
} 

代碼工作,但它已被複制到所有20類(對我來說似乎非常糟糕),我想把它放到每個活動類導入的單個類中,但是當我嘗試執行此操作時,像getPackageManager()startActivity(intent)之類的東西不再工作。

我該如何構建我的課堂才能做到這一點?還是我以錯誤的方式去做這件事?

回答

1
public class PDFUtlity{ 
    public static void showPdf(Context context) 
    { 
     File file = new File(Environment.getExternalStorageDirectory()+"/pdf/Read.pdf"); 
     PackageManager packageManager = context.getPackageManager(); 
     Intent testIntent = new Intent(Intent.ACTION_VIEW); 
     testIntent.setType("application/pdf"); 
     List list = packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY); 
     Intent intent = new Intent(); 
     intent.setAction(Intent.ACTION_VIEW); 
     Uri uri = Uri.fromFile(file); 
     intent.setDataAndType(uri, "application/pdf"); 
     ((Activity)context).startActivity(intent); 
    } 
} 

public class MyActivity extends Activity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ///..... 
     PDFUtlity.showPdf(this); 
    } 
} 
+0

我最終以您的第一條評論來創建一個活動類,然後爲所有其他類創建子類。這種靜態方法會比這更好嗎? – Ben

+0

是的,會的。我的第一個解決方案'創建一個擴展Activity並在新類中實現該方法,然後擴展您創建的新類的類'將是一種更好的做法,當您必須在您的每個活動中重寫活動方法時,例如: onBackPressed,onSaveInstanceState,onRestoreInstanceState(對於與Context密切操作的方法,然後在每個Activity中可以擴展這樣一個類的方法,你將不得不調用super();)但是,然後我再次讀到你的問題,並意識到沒有必要這樣的設計模式適合你的問題 –

3

我怎樣組織我的課要做到這一點?

步驟#1:使其成爲工具類的靜態方法。

步驟#2:添加Context ctxt作爲參數傳遞給該方法。

步驟3:對於在Context上實現的getPackageManager()startActivity()等方法,請在傳入的ctxt參數上調用它們。

第4步:拍擊你的手腕與使用字符串連接創建一個文件路徑的統治者,這樣做的正確方法。

第五步:擺脫你不使用queryIntentActivities()代碼。

public static void showPdf(Context ctxt) 
{ 
    File file = new File(Environment.getExternalStorageDirectory(), "/pdf/Read.pdf"); 
    Intent intent = new Intent(Intent.ACTION_VIEW); 

    intent.setDataAndType(Uri.fromFile(file), "application/pdf"); 
    startActivity(intent); 
} 

第6步:有目前呼叫showPdf()呼叫YourUtilityClass.showPdf(this)的地方。

+0

我最終創建了一個活動類「ActivityDisplayPDF」,然後更改了20個類中的每一個以擴展「ActivityDisplayPDF」。你的答案也會起作用,我想知道哪種更好的做法.. – Ben

+2

@本:強制繼承通常不是一個好主意,對於這麼小的東西。例如,如果您需要從「PreferenceActivity」中顯示此PDF,會發生什麼情況?或從一個'ListActivity'?現在你必須克隆'ActivityDisplayPDF',否則你不得不切換到我的解決方案(或類似的東西)。 – CommonsWare

相關問題