0

کار با Activity ها ، در برنامه نویسی اندروید

 
hosseinb68
hosseinb68
کاربر طلایی1
تاریخ عضویت : بهمن 1389 
تعداد پست ها : 1269
محل سکونت : بوشهر

نمایش یک عکس در پس زمینه یک Activity ، در برنامه نویسی اندروید

فرض کنید که بخواهیم یک عکس را در پس زمینه یک Activity نمایش بدهیم، برای این منظور، می توانیم به دو روش زیر عمل کنیم :

روش اول : تعیین عکس پس زمینه Activity ، با کدنویسی در فایل xml متناظر با Activity

همان طور که می دانید، برای Activity ، یک فایل xml متناظر داریم که عناصر گرافیکی Activity و در کل، ساختار گرافیکی Activity در آن تعریف می شود. فرض می کنیم که فایل xml متناظر با Activity در ابتدا دارای کدهای زیر باشد :


<LinearLayout 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" >

</LinearLayout>

فرض می کنیم که یک عکس با نام myImage درون یکی از پوشه های drawable از پروژه اندروید داریم (کاری به پسوند آن عکس نداریم، مثلا می تواند myImage.png باشد)، اکنون برای آنکه آن عکس را به عنوان پس زمینه Activity تعیین کنیم، باید مشخصه زیر را به تگ LinearLayout اضافه کنیم :


android:background="@drawable/myImage"

یعنی کدها به صورت زیر خواهند بود :


<LinearLayout 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:background="@drawable/myImage" >

</LinearLayout>

روش دوم : تعیین عکس پس زمینه Activity ، با کدنویسی در فایل java مربوط به Activity

فرض می کنیم که یک عکس با نام myImage درون یکی از پوشه های drawable از پروژه اندروید داریم (کاری به پسوند آن عکس نداریم، مثلا می تواند myImage.png باشد)، اکنون برای آنکه آن عکس را به عنوان پس زمینه Activity تعیین کنیم، باید در فایل java مربوط به آن Activity ، کدهای زیر را بنویسیم :


LinearLayout layout =(LinearLayout) findViewById(R.id.linearLayout1);
layout.setBackgroundDrawable(getResources().getDrawable(R.drawable.myImage));

دقت کنید که کدهای بالا، برای فایل xml زیر که متناظر با Activity می باشد، نوشته شده است :

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/linearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

</LinearLayout>

نکته مهم این است که در فایل xml مورد نظر، لایه به صورت LinearLayout انتخاب شده است (برای موارد دیگر، باید کدهای java را که ذکر کردیم، برای آن نوع لایه بنویسیم). همچنین برای LinearLayout ، یک id برابر linearLayout1 در نظر گرفته ایم که در کدهای java ، به آن ارجاع داده ایم.

یک شنبه 18 مرداد 1394  8:37 AM
تشکرات از این پست
hosseinb68
hosseinb68
کاربر طلایی1
تاریخ عضویت : بهمن 1389 
تعداد پست ها : 1269
محل سکونت : بوشهر

شفاف کردن پس زمینه (background) یک Activity ، در برنامه نویسی اندروید

رای شفاف کردن پس زمینه (background) یک Activity ، باید در فایل AndroidManifest.xml از پروژه اندروید، کد زیر را در تگ activity مربوط به آن Activity ، بنویسیم :

android:theme="@android:style/Theme.Translucent"

به عنوان مثال :


<activity
    android:name="com.kelidestan.com.MyActivity"
    android:theme="@android:style/Theme.Translucent"
    android:label="@string/title_my_activity" >
</activity>

 

یک شنبه 18 مرداد 1394  8:38 AM
تشکرات از این پست
hosseinb68
hosseinb68
کاربر طلایی1
تاریخ عضویت : بهمن 1389 
تعداد پست ها : 1269
محل سکونت : بوشهر

جلوگیری از نمایش صفحه سیاه (Black Screen)، هنگام رفتن به Activity جدید (قبل از نمایش Activity جدید)،

شاید برای شما پیش آمده باشد که هنگامی که قصد دارید از یک Activity به Activity دیگر بروید، قبل از نمایش Activity بعدی، یک صفحه سیاه (Black Screen) نمایش داده شده است. برای جلوگیری از این اتفاق، کدهای رفتن به Activity بعدی را به صورت زیر می نویسیم :


Intent intent = new Intent(Activity1.this, Activity2.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
overridePendingTransition (0, 0);

در کدهای بالا، نام Activity فعلی را برابر Activity1 و نام Activity بعدی را برابر Activity2 در نظر گرفته ایم.

یک شنبه 18 مرداد 1394  8:40 AM
تشکرات از این پست
hosseinb68
hosseinb68
کاربر طلایی1
تاریخ عضویت : بهمن 1389 
تعداد پست ها : 1269
محل سکونت : بوشهر

به دست آوردن نام Activity فعلی (که در حال اجرای کدهای آن هستیم)، در برنامه نویسی اندروید

برای به دست آوردن نام Activity فعلی (که در حال اجرای کدهای آن هستیم) و ذخیره کردن نام در یک رشته (String)، کد زیر را می نویسیم :

String Activity_name = this.getClass().getSimpleName();

دقت شود که این کد را در روش هایی (methods) مثل setOnClickListener (و OnClickListener) نمی توانیم به کار ببریم زیرا مقداری غیر از نام Activity به دست می آید. در این موارد، باید نام خود Activity هم در در کد ذکر شود (یعنی همان که دنبالش هستیم را باید بنویسیم !)، مثلا برای Activity با نام MainActivity ، باید کد زیر را بنویسیم :

String Activity_name = MainActivity.this.getClass().getSimpleName();

مثال کاملتر :


Button b = (Button) findViewById(R.id.button1);
b.setOnClickListener(new OnClickListener() {
                                                 
        @Override
        public void onClick(View v) {
                String Activity_name = MainActivity.this.getClass().getSimpleName();
                Toast.makeText(getApplicationContext(), Activity_name, Toast.LENGTH_SHORT).show();
        }
       
});

 

یک شنبه 18 مرداد 1394  8:54 AM
تشکرات از این پست
hosseinb68
hosseinb68
کاربر طلایی1
تاریخ عضویت : بهمن 1389 
تعداد پست ها : 1269
محل سکونت : بوشهر

بستن (destroy کردن) و اجرای دوباره یک Activity (در اصطلاح، restart یا refresh کردن Activity)، با اشا

در این مبحث قصد داریم آموزش بدهیم که چگونه می توانیم در یک Activity ، دکمه ای (Button) را قرار بدهیم که با اشاره بر روی آن دکمه، Activity بسته شده (destroy شود) و دوباره از ابتدا اجرا شود.

ابتدا در لایه گرافیکی Activity ، یک دکمه (Button) قرار می دهیم :


<LinearLayout 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" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

سپس کدهای Activity را به صورت زیر می نویسیم (نام Activity را برابر Activity_3 در نظر گرفته ایم) :


package com.kelidestan.com;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Activity_3 extends Activity {
       
        private int restart_or_not = 0;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_3);
               
                Button b = (Button) findViewById(R.id.button1);
                b.setOnClickListener(new OnClickListener() {
                                                                 
                        @Override
                        public void onClick(View v) {
                                restart_or_not = 1;
                                finish();
                        }
                });
               
        }
       

        @Override
        protected void onDestroy() {
                // TODO Auto-generated method stub
                if(restart_or_not==1){
                        Intent intent = new Intent(this, Activity_3.class);
                        startActivity(intent);
                }
                super.onDestroy();
        }

       
}

ابتدا یک متغیر را تعریف کرده ایم که توسط آن تشخیص می دهیم که کاربر قصد restart کردن Activity را دارد یا خیر (مقدار پیش فرض آن برابر 0 است) :


private int restart_or_not = 0;

با اشاره کاربر بر روی دکمه (Button) کدهای زیر اجرا می شوند :


restart_or_not = 1;
finish();

ابتدا مقدار متغیر restart_or_not را به 1 تغییر می دهیم و پس روش finish اجرا می شود که برای بستن (destroy کردن) Activity به کار می رود، اما ما قصد داریم که بعد از بسته شدن، دوباره Activity اجرا شود، بنابراین روش onDestroy را به صورت زیر نوشته ایم :


@Override
protected void onDestroy() {
        // TODO Auto-generated method stub
        if(restart_or_not==1){
                Intent intent = new Intent(this, Activity_3.class);
                startActivity(intent);
        }
        super.onDestroy();
}

در این روش، ابتدا مقدار restart_or_not را چک می کند و اگر برابر 1 بود، کد زیر اجرا خواهد شد :


Intent intent = new Intent(this, Activity_3.class);
startActivity(intent);

اجرای کد بالا باعث می شود که دوباره Activity از نو اجرا شود (نام Activity را برابر Activity_3 در نظر گرفته ایم).

شاید این پرسش به وجود بیاید که چرا اصلا متغیر restart_or_not تعریف شد و قبل از اجرای دوباره Activity ، ابتدا چک می کنیم که مقدار آن برابر 1 باشد. متغیر restart_or_not را به این دلیل به کار برده ایم که ممکن است کاربر، دکمه Back گوشی را فشار دهد که از Activity خارج شود (destroy شود)، چون برای روش onDestroy کد نوشته ایم، بنابراین آن کدها اجرا خواهند شد، بنابراین باید حتما مقدار متغیر restart_or_not برابر 1 باشد تا دوباره وارد Activity شویم و تنها در صورتی برابر 1 خواهد بود که کاربر بر روی دکمه مربوط به restart شدن Activity اشاره کرده باشد (نه در حالت معمولی که کاربر، دکمه Back گوشی را فشار می دهد).

نکته :

اگر نخواهیم نام Activity را در کدها ذکر کنیم، می توانیم با کد زیر، intent مربوط به آن را به دست بیاوریم (این کد در هر Activity که اجرا شود، intent مربوط به Activity را به ما می دهد) :


Intent intent = getIntent();

 

یک شنبه 18 مرداد 1394  8:56 AM
تشکرات از این پست
hosseinb68
hosseinb68
کاربر طلایی1
تاریخ عضویت : بهمن 1389 
تعداد پست ها : 1269
محل سکونت : بوشهر

روشی دیگر برای بستن (destroy کردن) و اجرای دوباره یک Activity (در اصطلاح، restart یا refresh کردن Ac

برای restart کردن یک Activity ، ابتدا در میان کدهای آن Activity ، روش onActivityResult را به صورت زیر کدنویسی می کنیم (Override می کنیم) :


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    super.onActivityResult(requestCode, resultCode, data);    

    if (requestCode == 1){
        finish();
    }
}

یعنی به عنوان مثال، موقعیت آن در Activity باید مشابه کد زیر باشد :


package com.kelidestan.com;

import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);        
                setContentView(R.layout.activity_main);
               
                // some code
        }
       
       
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
            super.onActivityResult(requestCode, resultCode, data);    

            if (requestCode == 1){
                finish();
            }
        }

}

سپس هر زمان که بخواهیم Activity را restart کنیم، باید یک سری کد اجرا شود، اما چگونگی کدها به این بستگی دارد که در چه محلی قصد داریم آنها را اجرا کنیم. برای محل کدها، دو حالت را در نظر می گیریم :

1- کدها در میان کدهای همان Activity که می خواهیم restart شود (مثلا با اشاره بر روی یک دکمه در خود Activity ، باعث restart شدن آن شویم).

2- کدها در میان کدهای کلاسی (Class) غیر از Activity مورد نظر که می خواهیم restart شود. این کلاس (Class) می تواند یک Activity دیگر، یک کلاس (Class) که خودمان تعریف کرده ایم، یک سرویس (Service) یا ... باشد.

1- کدها در میان کدهای همان Activity که می خواهیم restart شود :

در این حالت، کدهای زیر را در Activity اجرا می کنیم (برای restart شدن) :

 

Intent intent = new Intent(this, MyActivity.class);
//intent.putExtra("someData", "Here is some data");
startActivityForResult(intent, 1);

در کد بالا، نام Activity را برابر MyActivity در نظر گرفته ایم.

2- کدها در میان کدهای کلاسی (Class) غیر از Activity مورد نظر که می خواهیم restart شود :

در این حالت، کدهای زیر را در کلاس (Class) مورد نظر اجرا می کنیم (برای restart شدن) :


//intent.putExtra("someData", "Here is some data");
((Activity) myContext).startActivityForResult(myIntent, 1);

دقت شود که ابتدا Context و Intent مربوط به Activity (همان Activity که می خواهیم restart شود) را به آن کلاس ارسال کرده و سپس روش startActivityForResult را به شکل بالا اجرا می کنیم. در کد بالا، myContext و myIntent ، همان Context و Intent مربوط به Activity هستند که آن دو را به کلاس ارسال کرده ایم. در این حالت، فرض کرده ایم که Activity قبلا اجرا شده (یعنی یا اکنون آن را می بینیم یا در پس زمینه است).

یک شنبه 18 مرداد 1394  9:00 AM
تشکرات از این پست
hosseinb68
hosseinb68
کاربر طلایی1
تاریخ عضویت : بهمن 1389 
تعداد پست ها : 1269
محل سکونت : بوشهر

چگونگی اجرای روش startActivityForResult ، با کدنویسی در کلاسی (class) غیر از کلاس Activity ، در برنا

برای اجرای روش startActivityForResult با کدنویسی در کلاسی (class) غیر از کلاس Activity ، ابتدا باید Context و Intent مربوط به Activity را به آن کلاس ارسال کرده و سپس روش startActivityForResult را به صورت زیر اجرا نمایید :


((Activity) myContext).startActivityForResult(myIntent, 1);

در کد بالا، myContext و myIntent ، همان Context و Intent مربوط به Activity هستند که آن دو را به کلاس ارسال کرده ایم.

 

یک شنبه 18 مرداد 1394  9:01 AM
تشکرات از این پست
hosseinb68
hosseinb68
کاربر طلایی1
تاریخ عضویت : بهمن 1389 
تعداد پست ها : 1269
محل سکونت : بوشهر

اجرای یک روش (method) از یک Activity ، از طریق کدنویسی در کلاسی (Class) دیگر، در برنامه نویسی اندروی

ممکن است در یک Activity ، روشی (method) را تعریف کرده باشیم، اما در یک مورد خاص، قصد داشته باشیم که از کلاسی (Class) دیگر، آن روش (method) را اجرا کنیم. هدفمان از این کار هم می تواند این باشد که مثلا از طریق کلاسی (Class) دیگر بخواهیم با اجرای آن روش (method)، اطلاعاتی در Activity را تغییر بدهیم.

نام Activity را که در آن روش (method) تعریف شده است، برابر MainActivity در نظر می گیریم و کدهای آن را به صورت زیر می نویسیم :


package com.kelidestan.com;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
       
    int myValue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        setContentView(R.layout.activity_main);
               
        // some code
    }
       
    public void myMethod (int newValue) {
        // Change myValue
        myValue = newValue;
    }

}

همان طور که در کد بالا مشاهده می کنید، متغیری از جنس int و با نام myValue در MainActivity تعریف کرده ایم. همچنین یک روش (method) را در MainActivity تعریف کرده ایم که myMethod نام دارد و یک مقدار از جنس int را دریافت کرده و سپس آن مقدار را در myValue ذخیره می کند.

بنابراین ما با اجرای روش myMethod ، می توانیم مقدار متغیر myValue را تغییر بدهیم و چون این متغیر در MainActivity تعریف شده است، در واقع اطلاعات MainActivity را تغییر داده ایم. بنابراین چنانچه بتوانیم روش myMethod را در کلاسی (Class) دیگر و مستقل از MainActivity اجرا نماییم، توانسته ایم که با کلاسی دیگر، اطلاعات MainActivity را تغییر بدهیم.

برای اجرای روش myMethod در کلاسی (Class) دیگر، باید کد زیر را در آن کلاس اجرا کنیم


((MainActivity) myContext).myMethod(1);

در کد بالا، myContext همان Context مربوط به Activity (در اینجا Activity با نام MainActivity) می باشد که آن را به کلاس ارسال کرده ایم.

یک شنبه 18 مرداد 1394  9:02 AM
تشکرات از این پست
دسترسی سریع به انجمن ها