miércoles, 23 de julio de 2014
The great unknown GRADLE
Thanks God, André is enlightening us
http://andreborud.com/android-studio-automatic-incremental-gradle-versioning
miércoles, 25 de junio de 2014
viernes, 20 de junio de 2014
How to use Markdown to edit Blogger posts
Written with StackEdit.
this is the new platform I’ve found to publish with markdown.
via: http://blog.g14n.info/2013/12/how-to-use-markdown-to-edit-blogger.html#publish-on-blogger
Changing Menu Icons and the Drawer layout Icon depending the Theme
First generate the attrs.xml in values folder:
<resources>
<declare-styleable name="customAttrs">
<attr name="customUserInfoIcon" format="reference" />
<attr name="customDrawerLayoutIcon" format="reference" />
<attr name="customInfoDetailsIcon" format="reference" />
</declare-styleable>
</resources>
Second generate your diferent styles:
<style name="REDAppTheme" parent="AppTheme">
<item name="android:actionBarStyle">@style/REDActionBar</item>
<item name="customUserInfoIcon">@drawable/ic_action_userinfo_black</item>
<item name="customDrawerLayoutIcon">@drawable/ic_drawer_black</item>
<item name="customInfoDetailsIcon">@drawable/ic_action_info_details_black</item>
</style>
<style name="REDActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">@color/vbz_red</item>
<item name="android:titleTextStyle">@style/RED.ActionBar.TitleTextStyle</item>
<item name="android:icon">@drawable/icon_red</item>
</style>
<style name="RED.ActionBar.TitleTextStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
<item name="android:textColor">@color/black</item>
</style>
<style name="BLUEAppTheme" parent="AppTheme">
<item name="android:actionBarStyle">@style/BLUEActionBar</item>
<item name="customUserInfoIcon">@drawable/ic_action_userinfo_white</item>
<item name="customDrawerLayoutIcon">@drawable/ic_drawer_white</item>
<item name="customInfoDetailsIcon">@drawable/ic_action_info_details_white</item>
</style>
<style name="BLUEActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">@color/vbz_blue</item>
<item name="android:titleTextStyle">@style/BLUE.ActionBar.TitleTextStyle</item>
<item name="android:icon">@drawable/icon</item>
</style>
<style name="BLUE.ActionBar.TitleTextStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
<item name="android:textColor">@color/white</item>
</style>
Then you can use the different icons in your menu depending of the style you have chosen:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/userinfo"
android:orderInCategory="100"
android:showAsAction="always"
android:title="@string/userinfo"
android:icon="?attr/customUserInfoIcon"/>
<item
android:id="@+id/info"
android:orderInCategory="100"
android:showAsAction="always"
android:title="@string/info"
android:icon="?attr/customInfoDetailsIcon"/>
</menu>
And for the drawer layout you have to get the referenced Id and put it in the ActionBarDrawerToggle constructor:
TypedArray a = getTheme().obtainStyledAttributes(R.style.AppTheme, new int[] {R.attr.customDrawerLayoutIcon});
int attributeResourceId = a.getResourceId(0, 0);
// ActionBarDrawerToggle ties together the the proper interactions
// between the sliding drawer and the action bar app icon
drawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
drawerLayout, /* DrawerLayout object */
attributeResourceId, /* nav drawer image to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to
// onPrepareOptionsMenu()
}
};
viernes, 6 de junio de 2014
viernes, 16 de mayo de 2014
viernes, 4 de abril de 2014
miércoles, 2 de abril de 2014
miércoles, 12 de marzo de 2014
viernes, 7 de marzo de 2014
Call after drawing view
This is a Listener which gets called once that particular gets drawn completely.
via: http://stackoverflow.com/questions/12477026/how-to-understand-that-android-finished-drawing-a-view
via: http://stackoverflow.com/questions/12477026/how-to-understand-that-android-finished-drawing-a-view
lunes, 24 de febrero de 2014
Upload File to server
via http://androidexample.com/Upload_File_To_Server_-_Android_Example/index.php?view=article_discription&aid=83&aaid=106
via http://androidexample.com/Upload_File_To_Server_-_Android_Example/index.php?view=article_discription&aid=83&aaid=106
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class UploadToServer extends Activity {
TextView messageText;
Button uploadButton;
int serverResponseCode = 0;
ProgressDialog dialog = null;
String upLoadServerUri = null;
/********** File Path *************/
final String uploadFilePath = "/mnt/sdcard/";
final String uploadFileName = "service_lifecycle.png";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upload_to_server);
uploadButton = (Button)findViewById(R.id.uploadButton);
messageText = (TextView)findViewById(R.id.messageText);
messageText.setText("Uploading file path :- '/mnt/sdcard/"+uploadFileName+"'");
/************* Php script path ****************/
upLoadServerUri = "http://www.androidexample.com/media/UploadToServer.php";
uploadButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog = ProgressDialog.show(UploadToServer.this, "", "Uploading file...", true);
new Thread(new Runnable() {
public void run() {
runOnUiThread(new Runnable() {
public void run() {
messageText.setText("uploading started.....");
}
});
uploadFile(uploadFilePath + "" + uploadFileName);
}
}).start();
}
});
}
public int uploadFile(String sourceFileUri) {
String fileName = sourceFileUri;
HttpURLConnection conn = null;
DataOutputStream dos = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
File sourceFile = new File(sourceFileUri);
if (!sourceFile.isFile()) {
dialog.dismiss();
Log.e("uploadFile", "Source File not exist :"
+uploadFilePath + "" + uploadFileName);
runOnUiThread(new Runnable() {
public void run() {
messageText.setText("Source File not exist :"
+uploadFilePath + "" + uploadFileName);
}
});
return 0;
}
else
{
try {
// open a URL connection to the Servlet
FileInputStream fileInputStream = new FileInputStream(sourceFile);
URL url = new URL(upLoadServerUri);
// Open a HTTP connection to the URL
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("uploaded_file", fileName);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name="uploaded_file";filename=""
+ fileName + """ + lineEnd);
dos.writeBytes(lineEnd);
// create a buffer of maximum size
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// Responses from the server (code and message)
serverResponseCode = conn.getResponseCode();
String serverResponseMessage = conn.getResponseMessage();
Log.i("uploadFile", "HTTP Response is : "
+ serverResponseMessage + ": " + serverResponseCode);
if(serverResponseCode == 200){
runOnUiThread(new Runnable() {
public void run() {
String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"
+" http://www.androidexample.com/media/uploads/"
+uploadFileName;
messageText.setText(msg);
Toast.makeText(UploadToServer.this, "File Upload Complete.",
Toast.LENGTH_SHORT).show();
}
});
}
//close the streams //
fileInputStream.close();
dos.flush();
dos.close();
} catch (MalformedURLException ex) {
dialog.dismiss();
ex.printStackTrace();
runOnUiThread(new Runnable() {
public void run() {
messageText.setText("MalformedURLException Exception : check script url.");
Toast.makeText(UploadToServer.this, "MalformedURLException",
Toast.LENGTH_SHORT).show();
}
});
Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
} catch (Exception e) {
dialog.dismiss();
e.printStackTrace();
runOnUiThread(new Runnable() {
public void run() {
messageText.setText("Got Exception : see logcat ");
Toast.makeText(UploadToServer.this, "Got Exception : see logcat ",
Toast.LENGTH_SHORT).show();
}
});
Log.e("Upload file to server Exception", "Exception : "
+ e.getMessage(), e);
}
dialog.dismiss();
return serverResponseCode;
} // End else block
}
}
via http://androidexample.com/Upload_File_To_Server_-_Android_Example/index.php?view=article_discription&aid=83&aaid=106
jueves, 13 de febrero de 2014
Recover commit file version from git repository (eclipse)
This can be done via the context menu "Replace with/File in Git index" on the file in package view.
http://stackoverflow.com/questions/1750997/eclipse-git-checkout-aka-revert/4104149#4104149
http://stackoverflow.com/questions/1750997/eclipse-git-checkout-aka-revert/4104149#4104149
jueves, 30 de enero de 2014
Adding % in strings.xml
just add formatted="false" in the entry:
Please the field %s, in %s, should have a value!
Get connectivity in android
Common solution:
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnectedOrConnecting();
Using a broadcast receiver when the network state change:
Post data in body part
try {
URL url = new URL("http://requestb.in/14a9s7m1");
HttpURLConnection conn;
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
OutputStream os = null;
try {
os = conn.getOutputStream();
os.write("fkdlsakl!".getBytes());
} catch (Exception e) {
e.printStackTrace();
}
os.close();
conn.connect();
int respCode = conn.getResponseCode();
if(respCode == 200) {
InputStream ip = conn.getInputStream();
// response.headers = conn.getHeaderFields();
int s = ip.read();
ip.close();
}
} catch (Exception e) {}
jueves, 31 de octubre de 2013
Adjust image size to avoid memory issues with images so big
this is the code for decoding images inside a rectangle:
Then you can use it in this way:
private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// Calculate ratios of height and width to requested height and width
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// Choose the smallest ratio as inSampleSize value, this will guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
private Bitmap decodeBitmapFromResource(byte[] data,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(data, 0, data.length,options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeByteArray(data, 0, data.length,options);
}
Then you can use it in this way:
byte[] data = getImageFromUrl(url);
if(data!=null){
bitmap = decodeBitmapFromResource(data, image_size, image_size);
}
Horizontal View Swipe Eclipse Example
via: http://just-another-blog.net/
FIX: I think there's a mistake here: try:
The Goal is to implement horizontal View swiping with Tabs in Android like the Google Play Store.

I used the default code from Eclipse.
The Layout XML for the MainActivity:
The Layout XML for the DummyFragment:
Instead of the Dummy Fragment you can create your own Fragments.
Just create a new java class that extends “Fragment”.
You can attach your own Fragments to the “MainActivity” that way:
That’s all
I used the default code from Eclipse.
public class MainActivity extends FragmentActivity {
/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
* {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
* will keep every loaded fragment in memory. If this becomes too memory
* intensive, it may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
SectionsPagerAdapter mSectionsPagerAdapter;
/**
* The {@link ViewPager} that will host the section contents.
*/
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create the adapter that will return a fragment for each of the three
// primary sections of the app.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
// getItem is called to instantiate the fragment for the given page.
// Return a DummySectionFragment (defined as a static inner class
// below) with the page number as its lone argument.
Fragment fragment = new DummySectionFragment();
Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
switch (position) {
case 0:
return getString(R.string.title_section1).toUpperCase(l);
case 1:
return getString(R.string.title_section2).toUpperCase(l);
case 2:
return getString(R.string.title_section3).toUpperCase(l);
}
return null;
}
}
/**
* A dummy fragment representing a section of the app, but that simply
* displays dummy text.
*/
public static class DummySectionFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public static final String ARG_SECTION_NUMBER = "section_number";
public DummySectionFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main_dummy, container, false);
TextView dummyTextView = (TextView) rootView.findViewById(R.id.section_label);
dummyTextView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));
return rootView;
}
}
}
The Layout XML for the MainActivity:
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <!-- This title strip will display the currently visible page title, as well as the page titles for adjacent pages. --> <android.support.v4.view.PagerTitleStrip android:id="@+id/pager_title_strip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" android:background="#33b5e5" android:paddingBottom="4dp" android:paddingTop="4dp" android:textColor="#fff" /> </android.support.v4.view.ViewPager>
The Layout XML for the DummyFragment:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity$DummySectionFragment" > <TextView android:id="@+id/section_label" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
Instead of the Dummy Fragment you can create your own Fragments.
Just create a new java class that extends “Fragment”.
You can attach your own Fragments to the “MainActivity” that way:
@Override
public Fragment getItem(int position) {
Fragment fragment = new Fragment();
switch (position) {
case 0:
return fragment = new Fragment1();
case 1:
return fragment = new Fragment2();
case 2:
return fragment = new Fragment3();
default:
break;
}
return fragment;
That’s all
FIX: I think there's a mistake here: try:
@Override
public Fragment getItem(int position) {
Fragment fragment = new Fragment();
switch (position) {
case 0:
return new Fragment1();
case 1:
return new Fragment2();
case 2:
return new Fragment3();
default:
break;
}
return fragment;
via: http://just-another-blog.net/
lunes, 23 de septiembre de 2013
Show ActionBar items within fragments
To enable OnCreateOptionsMenu, onPrepareOptionsMenu, onOptionsItemSelected, in fragment, you have to call setHasOptionsMenu within the fragment’s onCreate() method:
setHasOptionsMenu(true);
miércoles, 18 de septiembre de 2013
Suscribirse a:
Entradas (Atom)