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

歡迎轉載,請註明出處。