2015年8月31日 星期一

Android-addFragment replaceFragment


BaseActivity.java
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;

public class BaseActivity extends Activity {

    
    private String TAG = "Fragment123";
    private String tag;
    private FragmentManager fragmentManager;

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

        fragmentManager = getFragmentManager();
        // init
        Fragment fragment1=new FristFragment();
        replaceFragment(fragment1);

    }

    // 取代Fragment 是無上一頁的
    public void replaceFragment(Fragment fragment){

        if(fragmentManager.getBackStackEntryCount()>0){
            fragmentManager.popBackStack();
            fragmentManager.executePendingTransactions();
        }
        
        tag = TAG + (fragmentManager.getBackStackEntryCount()> 
                0?fragmentManager.getBackStackEntryCount()-1:0);
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.linearLayout_01, fragment, tag);
        fragmentTransaction.commitAllowingStateLoss();
        fragmentManager.executePendingTransactions();
    }

    // 堆疊Fragment
    public void addFragment(Fragment fragment){
        
        tag = TAG + fragmentManager.getBackStackEntryCount();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.linearLayout_01, fragment, tag);
        fragmentTransaction.addToBackStack(tag);
        fragmentTransaction.commitAllowingStateLoss();
        fragmentManager.executePendingTransactions();
    }
    
    @Override
    public void onBackPressed() {
        if(fragmentManager.getBackStackEntryCount() != 0) {
            fragmentManager.popBackStack();
        } else {
            super.onBackPressed();
        }
    }

}

BaseFragment.java
import android.app.Fragment;
import android.os.Bundle;
import android.widget.TextView;

public class BaseFragment extends Fragment{

    private TextView text_titleName;
    
    public TextView getText_titleName() {
        return text_titleName;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        text_titleName = (TextView)getActivity().findViewById(R.id.textView1);
        
    }
    
    public void replaceFragment(Fragment fragment) {

        try{
            MainActivity activity = (MainActivity) getActivity();
            activity.replaceFragment(fragment);
        } catch (Exception e){

        }
    }
    
    public void addFragment(Fragment fragment) {

        try{
            MainActivity activity = (MainActivity) getActivity();
            activity.addFragment(fragment);
        } catch (Exception e){

        }
    }
    
}


2015年8月25日 星期二

Android-自定義 Button 的形狀( Shape )

看倦原生灰色的按鈕嗎?
這次我們來更改按鈕吧!

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 擺放有順序性 -->
    <!-- 被按壓 -->
    <item android:state_pressed="true"><shape>

            <!-- 實心 -->
            <solid 
                android:color="#97CBFF"/>
            
            <!-- 邊框 顏色 -->
            <stroke 
                android:width="1dp" 
                android:color="#0066CC" />
            
            <!-- 圓角 -->
            <corners 
                android:radius="6dp" />
            
            <!-- 間距 -->
            <padding 
                android:bottom="10dp" 
                android:left="10dp" 
                android:right="10dp" 
                android:top="10dp" />
            
        </shape></item>
    <!-- 一般狀態 -->
    <item><shape>

            <!-- 漸變 -->
            <!--
                 45倍數為單位 Max : 360  ,Min : 0 
                angle 的參數是影響漸層出發的位置 EX : 左至右、上至下
            -->
            <gradient 
                android:angle="0" 
                android:startColor="#2894FF"
                android:endColor="#0066CC"  />
            
            <!-- 邊框 -->
            <stroke android:width="1dp" 
                android:color="#0066CC" />
            
            <!-- 圓角 -->
            <corners 
                android:radius="6dp" />
            
            <!-- 間距 -->
            <padding 
                android:bottom="10dp" 
                android:left="10dp" 
                android:right="10dp" 
                android:top="10dp" />
        </shape></item>

</selector>

參考資訊 : android中shape的使用(android:angle小解)
參考資訊 : [Android] Shape xml 文件定義 − shape 標籤的 size 標籤的相關屬性用途
參考資訊 : Android样式的开发:shape篇
參考資訊 : 色碼表


歡迎轉載,請註明出處。

Android-避免Launcher 的 Label Image name 被更換

各位大大是否有以下的經歷
  1. 匯入第三方的 aar 但是自己的App被改名
  2. 加入SDK但本身的App 相關資料被更改
如果有以下的症狀,請在 AndroidManifest 內加上 : 
<application
    tools:replace="icon, label, name"
    android:hardwareAccelerated="true"
    android:largeHeap="true"
    android:name=".activity.MyApplication"
    android:label="@string/app_name"
    android:allowBackup="true"
    android:icon="@drawable/app_icon"
    android:theme="@style/AppTheme"
    .
    .
    .
    .

顧名思義,將
icon 取代為 android : icon = "@drawable/app_icon"
label 取代為 android : label = "@string/app_name"

歡迎轉載,請註明出處。

2015年8月24日 星期一

Android-Notification 簡單範例

1 . 一般
notification(MainActivity.this, "提示 Title", "提示 Message");

private void notification(Context context, String title, String message){

    final int notifyID = 1; // 通知的識別號碼
    final NotificationManager notificationManager = 
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    final Notification notification = new Notification
            .Builder(context)
    .setSmallIcon(R.drawable.ic_launcher) // 24 x 24 px
    .setContentTitle(title)
    .setContentText(message)
    .build(); 
    notificationManager.notify(notifyID, notification); 
}

2 . 持續型( 常駐 )
private NotificationManager manager;
private Bitmap icon;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    icon = BitmapFactory.decodeResource(getResources(),
            R.drawable.ic_launcher);
    .
    .
    .

// 顯示客製化視窗                
private void showCustomView() {
    // 控制面板
    RemoteViews remoteViews = new RemoteViews(getPackageName(),
            R.layout.notification_design);
    
    // 被觸發後發送對應的廣播
    Intent intent = new Intent();
    intent.setAction("i_am_hungry");
    intent.putExtra("HELLO", "7");
    
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    
    // 面板內的元件設置接收器(原因 : RemoteView沒有定義此方法)
    remoteViews.setOnClickPendingIntent(R.id.imageView1, pendingIntent);
    
    // 建立相關元件
    NotificationCompat.Builder builder = new Builder(this);
    
    builder.setContent(remoteViews)
           // 狀態列的Icon
           .setSmallIcon(R.drawable.music_icon)
           // 提醒內的大型Icon
           .setLargeIcon(icon)
           // 是否持續顯示提醒
           .setOngoing(true)
           // 狀態列的條碼燈( 只會出現一次 )
           .setTicker("123456");
    
    manager.notify(7, builder.build());
}

如果要取消常駐型提醒
manager.cancelAll();

public class Rreciver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle0311 = intent.getExtras();
        if(bundle0311!= null){
            String aaa = bundle0311.getString("HELLO");
            NotificationManager manager = (NotificationManager) 
                context.getSystemService(Context.NOTIFICATION_SERVICE);
            // 清除所以有的 Notification
            // manager.cancelAll();
            // 清除指定的 Notification
            manager.cancel(Integer.parseInt(aaa));

        }
    }
}

記住,記得一定要加上監聽
<receiver android:name="Rreciver">
    <intent-filter>
        <action android:name="i_am_hungry" />
    </intent-filter>
 </receiver>


參考資料 : android notification 總結
參考資料 : Android--通知之Notification
參考資料 : Android 如何顯示通知訊息(Notifications)?

歡迎轉載,請註明出處。

2015年8月21日 星期五

Android-Dialog 範例 說明

更新日期 : 20160130 更新代碼錯誤

為甚麼要用 Dialog?
因為方便提醒使用者現在程式的狀況
例如 :
登入遊戲卻遲遲無反應。
結果是帳號密碼輸入錯誤
如果不給 User 提示
那因該不管是誰都會很囧吧

官方已經有範例
但是要更有彈性就只能自己做更改

import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
/**
 * BaseDialog Tool
 * The DialogInterface.OnClickListener is default
 * @Override
    public void onClick(DialogInterface dialog, int which) {
        switch(which)
        {
        case AlertDialog.BUTTON_POSITIVE:
            break;
        case AlertDialog.BUTTON_NEGATIVE:
            break;
        case AlertDialog.BUTTON_NEUTRAL:
            break;
        }
    }
 *
 */
public class MyDialog{

    private Context context;
    private String title;
    private String message;
    private String positiveText;
    private String negativeText;
    private String neutralText;
    private AlertDialog.Builder builder;
    private DialogInterface.OnClickListener positiveDialogCallBack;
    private DialogInterface.OnClickListener negativeDialogCallBack;
    private DialogInterface.OnClickListener neutralDialogCallBack;

    public MyDialog(Context context){
        this.context = context;
    }

    /** set dialog title text */
    public MyDialog setTitle(String title){
        this.title = title;    
        return this;
    }

    /** set dialog title text */
    public MyDialog setTitle(int r){
        this.title = context.getResources().getString(r);
        return this;
    }

    /** set dialog message text */
    public MyDialog setMessage(String message){
        this.message = message;    
        return this;
    }

    /** set dialog message text */
    public MyDialog setMessage(int r){
        this.message = context.getResources().getString(r);    
        return this;
    }

    /** set positive button text */
    public MyDialog setPositiveText(String positiveText){
        this.positiveText = positiveText;
        return this;
    }

    /** set positive button text */
    public MyDialog setPositiveText(int r){
        this.positiveText = context.getResources().getString(r);;
        return this;
    }

    /** set negative button text */
    public MyDialog setNegativeText(String negativeText){
        this.negativeText = negativeText;
        return this;
    }

    /** set negative button text */
    public MyDialog setNegativeText(int r){
        this.negativeText = context.getResources().getString(r);;
        return this;
    }
    
    /** set neutral button text */
    public MyDialog setNeutralText(String neutralText){
        this.neutralText = neutralText;
        return this;
    }

    /** set neutral button text */
    public MyDialog setNeutralText(int r){
        this.neutralText = context.getResources().getString(r);;
        return this;
    }

    /** AlertDialog.BUTTON_POSITIVE */
    public MyDialog setOnPositiveListener(
    DialogInterface.OnClickListener onPositiveListener) {
    
        this.positiveDialogCallBack = onPositiveListener;
        return this;
    }

    /** AlertDialog.BUTTON_NEGATIVE */
    public MyDialog setOnNegativeListener(
        DialogInterface.OnClickListener onNegativeListener) {
        
        this.negativeDialogCallBack = onNegativeListener;
        return this;
    }
    
    /** AlertDialog.BUTTON_NEGATIVE */
    public MyDialog setOnNeutralListenerListener(
        DialogInterface.OnClickListener onNeutralListener) {
        
        this.neutralDialogCallBack = onNeutralListener;
        return this;
    }
    
    /** Display you setting dialog */
    public void show() {
        builder = new AlertDialog.Builder(context);
        if(title != null)
            builder.setTitle(title);
        if(message != null)
            builder.setMessage(message);
        if(positiveText != null || positiveDialogCallBack != null)
            builder.setPositiveButton(positiveText, positiveDialogCallBack);
        if(negativeText != null || negativeDialogCallBack != null)
            builder.setNegativeButton(negativeText, negativeDialogCallBack);
        if(neutralText != null || neutralDialogCallBack != null)
            builder.setNeutralButton(neutralText, neutralDialogCallBack);
        builder.create().show();
    }
}

new MyDialog(MainActivity.this).setTitle("Hello").setMessage("How are you?")
                .setNeutralText("Neutral").setNegativeText("Negative").setPositiveText("Positive")
                .show();














參考資訊 : How to handle Back button with in the dialog?
參考資訊 : AlertDialog
參考資料 : AlertDialog_zh

歡迎轉載,請註明出處。

2015年8月19日 星期三

Android-ProgressDialog Sample 說明

相信各位對等待視窗不陌生吧
現在直接把它寫成簡單的工具
直接呼叫,就可以省掉版面的空間
不管是你我都可能會犯致命的錯誤
就是底下紅字的地方
他不是 new ProgressDialog()

1 . MyProgressDialog.java
import android.app.ProgressDialog;
import android.content.Context;

public class MyProgressDialog {
    // 等待5秒鐘
    private final int delayTime = 5000;
    private Context _context;
    private String _title;
    private String _message;
    private ProgressDialog progressDialog;
    
    public MyProgressDialog(Context context, String title, String message){
        this._context = context;
        this._title = title;
        this._message = message;
    }
    
    // 顯示
    public void show(){
        progressDialog = ProgressDialog.show(_context, _title, _message, 
                true, false);
        
            new Thread() {
                public void run() {

                    try{
                        sleep(delayTime);
                    } catch (Exception e) {
                        
                    }
                    progressDialog.dismiss();
                }
            }.start();
    }
    
    // 取消
    public void dimiss(){
        progressDialog.dismiss();
    }

}

2 . MainActivity.java
public class MainActivity extends Activity {

    private MyProgressDialog progressDialog;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        progressDialog = new MyProgressDialog(this, "Title", "Message");
        progressDialog.show();
        .
        .
        .
        


參考來源 : Android学习笔记之ProgressDialog
參考來源 : Process

參考資料 : Android 自定义progressDialog实现

歡迎轉載,請註明出處。

Android-Fragment transfer data to another framgnet

Fragment 傳遞參數的功能其實很像 Activity 傳遞的作法
但是不同的地方是它是藉由 Fragment 傳遞( 先不做深入說明 )
注意 : 請注意紅字

1 . 傳值來源
// A Fragment
Fragment fragment = new AFragment();
Bundle bundle = new Bundle();
bundle.putString(Key, Value);
fragment.setArguments(bundle);
.
.
.


2 . 接收目標
// B Fragment
Bundle bundle = BFragment.this.getArguments();
if(bundle != null)
{
    String fruit = bundle.getString(Key, Value);
}

參考資料 : How to transfer some data to another Fragment?

歡迎轉載,請註明出處。

2015年8月14日 星期五

Android-Side Menu

第三方Jar : simple-side-drawer
優點 : 快速建置
缺點 : 單純文字選單OK,如果有圖片會導致流暢度差

超多範例 : SlidingMenu
整理過的Blog : SlidingMenu 資源
詳細圖文教學 : 安卓开发笔记——关于开源项目SlidingMenu的使用介绍
推薦

目前選擇 http://blog.csdn.net/luck_apple/article/details/9207811
詳細資料請留資料或自行下載

Open Slide Menu to slow :
Android slow sliding menu when using background images
Enyo performance: Slow Sliding Animation on Tablet

Android-Switch can't use on Android 5.0 up

各位大大是否有以下的情形
在 5.0 以下手機開發的時候 Switch 元件沒問題
但 5.0 以上手機只要被觸發
就直接 java.lang.NullPointerException: Attempt to invoke virtual method......

如果問題是以下的連結,那就是本文的主旨 :
Switch Widget if not providing any drawable crash application

簡單的說,官方避免惡意的設計。

Before
一般我們直接拖曳生成的

<Switch
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:id="@+id/switch"/>

Switch switch_door = (Switch)dialog.findViewById.....

-------------------------------------------------------

After

但在 Android5.0 是無法被正常運作的
必須更改為

<android.support.v7.widget.SwitchCompat
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:id="@+id/switch"/>

SwitchCompat switch_door = (SwitchCompat)dialog.findViewById.....

使用方法大同小異
如果要更進階的請參考 : 連結

參考資料 : Switch crashes when clicked on Android 5.0

歡迎轉載,請註明出處。

2015年8月13日 星期四

Android-JSON 組合使用介紹

我們在之前有提到 Android-JSON 拆解使用介紹

今天我們來實踐 JSON 組裝對應資料
比如 :

-----------------------------------------------------------------------------------------------------------------
Name
NickName
Brithday
Tom
Apple
1988/01/01
John
Cat
1989/02/02

-----------------------------------------------------------------------------------------------------------------
我們先抓對應的Key : Name、NickName、BrithDay

// Tom 的資料
JSONObject json_1 = new JSONObject();
json_1.put("Name", "Tom");
json_1.put("NickName", "Apple");
json_1.put("BrithDay", "1988/01/01");

// John 的資料
JSONObject json_2 = new JSONObject();
json_2.put("Name", "John");
json_2.put("BrithDay", "Cat");
json_2.put("action", "1989/02/02");

// 將兩筆資料組合
JSONArray jsonArray = new JSONArray();
jsonArray.put(json_1);
jsonArray.put(json_2);

// 將整合好了資料放在 JSONObject 並設置相對應的 Key
JSONObject json = new JSONObject();
json.put("Vlaue", jsonArray);

System.out.println("json : " + json.toString());

輸出 :
{
    "Vlaue":[
        {
            "Name":"Tom",
            "BrithDay":"1988/01/01",
            "NickName":"Apple"
        },
        {
            "Name":"Cat",
            "BrithDay":"1989/02/02",
            "NickName":"John"
        }
    ]
}


如果我們要存成字串在轉回來要怎辦 ?

2015年8月10日 星期一

Android-Map String 互相轉換

Map 與 String 互相轉換

Map To String

Map<String, String> map = new HashMap<String, String>();
map.put("Tom", "1988/01/01");
map.put("John", "1977/02/02");
        
String strMap = map.toString();




--------------------------------------------------------------------------------------
String To Map

String mapToString = "Tom=1988/01/01, John=1977/02/02";
Map<String, String> map = new HashMap<String, String>();
for(final String entry : mapToString.split(",")) {
    final String[] parts = entry.split("=");
    assert(parts.length == 2) : "Invalid entry: " + entry;
    map.put(parts[0], parts[1]);
}
Log.d("tttttt","Map to String : "+map.get("Tom").toString());







歡迎轉載,請註明出處。

2015年8月8日 星期六

Android-Can't start Git : git.exe

不知道各位大大是否有發生過 AndrodiStudio 要求您指定 Git.exe

目前有兩種可能 :

1 . 路徑跑掉

* : 如果是以上的問題請重新設置路徑
-----------------------------------------------------------------------------
2 . 因為沒預設,所以在 Loading 的時候無法載入

* : 如果是以上問題( 包括新安裝 AndroidStudio..等,以下是解法 )
1 . 跳出提醒






2 . 查看路徑
















3 . 下載 Git 的Window 版本













傳送門 : Git fo Window

4 . 安裝Git

















歡迎轉載,請註明來源出處。