انجمن سایت کلیدستان


رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
نوشتن متغیر در سطح کلاس (در برنامه نویسی اندروید)

نوشتن متغیر در سطح کلاس (در برنامه نویسی اندروید)

#1
Question 
سلام میخواستم بدونم چطوری میشه یه متغییر رو در سطح کلاس نوشت که مقدارش رو از onPageChangeListener بگیره؟ (که اون مقدار آدرس drawable عکسی باشه که تو اون صفحه است)
پاسخ

نوشتن متغیر در سطح کلاس (در برنامه نویسی اندروید)

#2
سلام.
دقیق متوجه منظورتون نشدم.
اگر بیشتر توضیح بدهید و بخشی از کدها رو هم ذکر کنید (توضیحات به همراه کدها باشد)، شاید بتونم کمکتون کنم.

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط mfn100

نوشتن متغیر در سطح کلاس (در برنامه نویسی اندروید)

#3
من تو برنامه ام از گرید ویو با image View pager استفاده کردم حالا وقتی میخوام اون عکس ها رو اشتراک گذاری کنم (share) رو هر کدم از عکس ها که برم فقط اون عکس اولی که تو آداپتر بود اشتراک گذاری میشه. چطوری میشه عکس یه که از image View pager آدرس دهی شده رو به اشتراک گذاشت؟؟؟

تو یه جایی خوندم که باید از  
onPageChangeListener استفاده کرد

این کد صفحه ای که عکس های گرید ویو رو نمایش میدست و برای عوض کردن عکس ها هم  از viewPager استفاده کردم و تو اکشن بار من یک دکمه گذاشتم که وقتی رو اون کلیک شد عکس اون صفحه رو اشترک گذاری کنه ولی وقتی رو اون دکمه کلیک میکنم فقط اولین عکس آداپتر رو share میکنه و وقتی عکس هم عوض میکنم باز هم همون عکسه اشتراک گذاری میشه!!

کد پی‌اچ‌پی:
package com.microprogram.postallcard;


import android.app.ActionBar;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.Toast;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;


import static com.microprogram.postallcard.R.id.pager;




public class 
Eshgh_ImageShow extends ActionBarActivity {


    @
Override
    
protected void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        
setTitle("عاشقانه");
        
setContentView(R.layout.activity_eshgh__image_show);
        
Intent p getIntent();
        
int position p.getExtras().getInt("id");


        
Eshgh_Adapter imageAdapter = new Eshgh_Adapter(this);
        List<
ImageViewimages = new ArrayList<ImageView>();


        for (
int i 0imageAdapter.getCount(); i++){
            
ImageView imageView= new ImageView (this);
            
imageView.setImageResource(imageAdapter.mThumbIds[i]);
            
imageView.setScaleType(ImageView.ScaleType.CENTER);
            
images.add(imageView);
        }


        
ImagePagerAdapter pagerAdapter = new ImagePagerAdapter(images);
        
ViewPager viewPag = (ViewPagerfindViewById(pager);
        
viewPag.setAdapter(pagerAdapter);
        
viewPag.setCurrentItem(position);


    }


    @
Override
    
public boolean onCreateOptionsMenu(Menu menu) {
        
// Inflate the menu; this adds items to the action bar if it is present.
        
getMenuInflater().inflate(R.menu.menu_eshgh__image_showmenu);
        return 
true;
    }


    @
Override
    
public boolean onOptionsItemSelected(MenuItem item) {
        
Intent p getIntent();
        
int position p.getExtras().getInt("id");
        
int i 0;
        
Eshgh_Adapter imageAdapter = new Eshgh_Adapter(this);
        switch (
item.getItemId()) {


            case 
R.id.share:
                
Bitmap bitmap;
                
OutputStream output;
                
Intent share;


                
bitmapBitmapFactory.decodeResource(getResources(),imageAdapter.mThumbIds[i]);
                
File filepath Environment.getExternalStorageDirectory();
                
File dir = new File (filepath.getAbsolutePath() + "/.PostallCard/");
                
dir.mkdirs();
                
File file = new File(dir"Eshgh.png");


                try {


                    
share = new Intent(Intent.ACTION_SEND);
                    
share.setType("image/jpeg");
                    
output = new FileOutputStream(file);
                    
bitmap.compress(Bitmap.CompressFormat.PNG100output);
                    
output.flush();
                    
output.close();
                    
Uri uri Uri.fromFile(file);
                    
share.putExtra(Intent.EXTRA_STREAM,uri);
                    
startActivity(Intent.createChooser(share"Share Image"));
                }
                catch(
Exception e){
                    
e.printStackTrace();
                }
                return 
true;
            case 
R.id.favorite:
                return 
true;


            default:
                return 
super.onOptionsItemSelected(item);


        }
    }

 
پاسخ

نوشتن متغیر در سطح کلاس (در برنامه نویسی اندروید)

#4
کد مربوط به ساخت Bitmap (که بعدا برای ساخت فایل عکس برای به اشتراک گذاری به کار می رود) را ببینید :

کد پی‌اچ‌پی:
bitmapBitmapFactory.decodeResource(getResources(),imageAdapter.mThumbIds[i]); 

در آن، عکس را با عبارت زیر مشخص کرده اید :

کد پی‌اچ‌پی:
imageAdapter.mThumbIds[i

که یعنی عنصر شماره i از آرایه مورد نظر (آرایه mThumbIds در imageAdapter). حالا ببینیم که این شماره i چجوری تعیین می شود، بنابراین در خط های قبل تر، این خط از کدها را داریم :

کد پی‌اچ‌پی:
int i 0

بنابراین i برابر صفر تعریف شده (و تا آنجایی که من بررسی کردم، ندیدم در جای دیگری تغییر داده بشه)، یعنی ما همیشه اولین عنصر از آن آرایه (Array) را فراخوانی می کنیم. مثلا اگر آن را به 1 تغیییر بدهید، احتمالا همیشه عکس دوم از آرایه فراخوانی شده و بعد به اشتراک گذاری می شود.
من با ساختار کدهایی که به کار بردید، خیلی آشنا نیستم، ولی در کل باید به جای i ، متغیری را بنویسید که شماره درست متناظر با عکس را به شما بدهد. مثلا همین متغیر position ، احتمالا در کدها، به عنوان شماره متناظر با عکس باید باشد. یعنی کد زیر را به جای آن خط از کدها بنویسید :

کد پی‌اچ‌پی:
imageAdapter.mThumbIds[position

که در آن، position را به جای i نوشته ایم. اگر درست عمل نکرد، متغیر مناسب برای نمایش شماره متناظر با عکس را بر اساس ساختار کدها بسازید.

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط داش بهروز ، mfn100

نوشتن متغیر در سطح کلاس (در برنامه نویسی اندروید)

#5
دوست عزیز همون طور که آدمین جان گفت شما اشتباهتون این که توی دستور زیر از شمارنده i استفاده کردید..

کد پی‌اچ‌پی:
bitmapBitmapFactory.decodeResource(getResources(),imageAdapter.mThumbIds[i]); 

وچون مقدار i برابر صفر بوده در سطح کلاس پس اصولا باید همان عکس اول ارسال شود..حالا چه کنیم.بهترین روش اینه که onpagerLisinerاستفاده کنید..دقت کنید به نظر من بهترین روش چون میشود از روش کوتاه تر استفاده کرد اما توی خیلی موارد و Sdkمختلف ممکن است کار نکند..
ابتدا در سطح اصلی کلاس یه متغییر سراسری مثل زیر بسازید.

کد پی‌اچ‌پی:
int Base_position=0

و سپس روی viewPager خودتون یه شنونده pagerLisinear تعریف کنید..این شنونده زمانی صدا زده میشود که صفحه تغییر کند..

کد پی‌اچ‌پی:
viewPag.setOnPageChangeListener(new OnPageChangeListener() {
                    
                    @
Override
                    
public void onPageSelected(int position) {
                        
// TODO Auto-generated method stub
                        
Base_position=position;
                    }
                    
                    @
Override
                    
public void onPageScrolled(int arg0float arg1int arg2) {
                        
// TODO Auto-generated method stub
                        
                    
}
                    
                    @
Override
                    
public void onPageScrollStateChanged(int arg0) {
                        
// TODO Auto-generated method stub
                        
                    
}
                }) 

در کد بالا چندین متد overrideشده است ..که یکی از این متدها باید بهش توجه کنید متد زیر است

کد پی‌اچ‌پی:
@Override
                    
public void onPageSelected(int position) {
                        
// TODO Auto-generated method stub
                        
Base_position=position;
                    } 

این متد یه ورودی position داره که شماره همون صفحه ای است که در آن قرار داریم..داخل بدنه این شماره رو به متغیرBase_position پاس دادیم..
حالا میتونید این متغییر رو جانشین i کنید.

کد پی‌اچ‌پی:
bitmapBitmapFactory.decodeResource(getResources(),imageAdapter.mThumbIds[Base_position]); 

امیدوارم توضیحات کامل بوده باشه و مشکلتون حل بشه.
پاسخ
 سپاس شده توسط admin ، mfn100

نوشتن متغیر در سطح کلاس (در برنامه نویسی اندروید)

#6
(۱۳۹۳/۱۲/۲۲, ۰۳:۳۹ ق.ظ)'داش بهروز' نوشته: دوست عزیز همون طور که آدمین جان گفت شما اشتباهتون این که توی دستور زیر از شمارنده i استفاده کردید..

کد پی‌اچ‌پی:
bitmapBitmapFactory.decodeResource(getResources(),imageAdapter.mThumbIds[i]);[/i

وچون مقدار i برابر صفر بوده در سطح کلاس پس اصولا باید همان عکس اول ارسال شود..حالا چه کنیم.بهترین روش اینه که onpagerLisinerاستفاده کنید..دقت کنید به نظر من بهترین روش چون میشود از روش کوتاه تر استفاده کرد اما توی خیلی موارد و Sdkمختلف ممکن است کار نکند..
ابتدا در سطح اصلی کلاس یه متغییر سراسری مثل زیر بسازید.

کد پی‌اچ‌پی:
[i]int Base_position=0;[/i

و سپس روی viewPager خودتون یه شنونده pagerLisinear تعریف کنید..این شنونده زمانی صدا زده میشود که صفحه تغییر کند..
کد پی‌اچ‌پی:
[i]    viewPag.setOnPageChangeListener(new OnPageChangeListener() {
                    
                    @
Override
                    
public void onPageSelected(int position) {
                        
// TODO Auto-generated method stub
                        
Base_position=position;
                    }
                    
                    @
Override
                    
public void onPageScrolled(int arg0float arg1int arg2) {
                        
// TODO Auto-generated method stub
                        
                    
}
                    
                    @
Override
                    
public void onPageScrollStateChanged(int arg0) {
                        
// TODO Auto-generated method stub
                        
                    
}
                })
[/
i

در کد بالا چندین متد overrideشده است ..که یکی از این متدها باید بهش توجه کنید متد زیر است
کد پی‌اچ‌پی:
[i]@Override
                    
public void onPageSelected(int position) {
                        
// TODO Auto-generated method stub
                        
Base_position=position;
                    }[/
i

این متد یه ورودی position داره که شماره همون صفحه ای است که در آن قرار داریم..داخل بدنه این شماره رو به متغیرBase_position پاس دادیم..
حالا میتونید این متغییر رو جانشین i کنید.

کد پی‌اچ‌پی:
[i]bitmapBitmapFactory.decodeResource(getResources(),imageAdapter.mThumbIds[Base_position]); [/i

امیدوارم توضیحات کامل بوده باشه و مشکلتون حل بشه.


ممنون که پاسخم رو دادید.
این روش کار میکنه.

همه ی کار هایی رو که گفتید رو انجام دادم و کدم شو این:
کد پی‌اچ‌پی:
package com.microprogram.postallcard;

import android.app.ActionBar;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import static com.microprogram.postallcard.R.id.pager;


public class 
Eshgh_ImageShow extends ActionBarActivity {

    @
Override
    
protected void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        
setTitle("عشقولانه");
        
setContentView(R.layout.activity_eshgh__image_show);

        
Intent p getIntent();
        
Button btn1 = (ButtonfindViewById(R.id.share);
        final 
ViewPager viewPag = (ViewPagerfindViewById(pager);
        final 
int position p.getExtras().getInt("id");
        final 
Eshgh_Adapter imageAdapter = new Eshgh_Adapter(this);
        List<
ImageViewimages = new ArrayList<ImageView>();

        for (
int i 0imageAdapter.getCount(); i++){
            
ImageView imageView= new ImageView (this);
            
imageView.setImageResource(imageAdapter.mThumbIds[i]);
            
imageView.setScaleType(ImageView.ScaleType.CENTER);
            
images.add(imageView);
        }

        
ImagePagerAdapter pagerAdapter = new ImagePagerAdapter(images);
        
viewPag.setAdapter(pagerAdapter);
        
viewPag.setCurrentItem(position);



        }

    @
Override
    
public boolean onCreateOptionsMenu(Menu menu) {
        
// Inflate the menu; this adds items to the action bar if it is present.
        
getMenuInflater().inflate(R.menu.menu_eshgh__image_showmenu);
        return 
true;
    }

    @
Override
    
public boolean onOptionsItemSelected(MenuItem item) {
        
Intent p getIntent();
        
int position p.getExtras().getInt("id");
        
ViewPager viewPag = (ViewPagerfindViewById(pager);
        
Eshgh_Adapter imageAdapter = new Eshgh_Adapter(this);
        switch (
item.getItemId()) {

            case 
R.id.share:

                
viewPag.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                    public 
void onPageScrollStateChanged(int state) {}
                    public 
void onPageScrolled(int positionfloat positionOffsetint positionOffsetPixels) {}



                    
int Base_position=0;

                    public 
void onPageSelected(int position) {
                        
Base_position position;         }



                });

                
Bitmap bitmap;
                
OutputStream output;
                
Intent share;

                
bitmapBitmapFactory.decodeResource(getResources(),imageAdapter.mThumbIds[Base_position]);
                
File filepath Environment.getExternalStorageDirectory();
                
File dir = new File (filepath.getAbsolutePath() + "/.PostallCard/");
                
dir.mkdirs();
                
File file = new File(dir"Eshgh.png");

                try {

                    
share = new Intent(Intent.ACTION_SEND);
                    
share.setType("image/jpeg");
                    
output = new FileOutputStream(file);
                    
bitmap.compress(Bitmap.CompressFormat.PNG100output);
                    
output.flush();
                    
output.close();
                    
Uri uri Uri.fromFile(file);
                    
share.putExtra(Intent.EXTRA_STREAM,uri);
                    
startActivity(Intent.createChooser(share"Share Image"));
                }
                catch(
Exception e){
                    
e.printStackTrace();
                }

                return 
true;
            case 
R.id.favorite:
                return 
true;

            default:
                return 
super.onOptionsItemSelected(item);

        }
    }

فقط یه مشکلی دارم اینه که من کد های اشتراک گذاری رو باید کجا قرار بدم؟
چون در این حالتی که من گذاشتم 
کد پی‌اچ‌پی:
bitmapBitmapFactory.decodeResource(getResources(),imageAdapter.mThumbIds[Base_position]); 
قسمت Base_position ارور میده و میگه نمیشناستش .
همه راه هایی رو که میتونستم امتحان کردم ولی بازم نشد.
یه بارم کد اشتراک گذاری رو توی این قسمت کذاشتم همه چیز درست بود ولی مشکل این جا بود که هر وقت صفحه رو عوض میکردم صفحه اشتراک گذاری باز میشد:
کد پی‌اچ‌پی:
public void onPageSelected(int position) {
                        
Base_position position;    
     } 


 
پاسخ

نوشتن متغیر در سطح کلاس (در برنامه نویسی اندروید)

#7
خب اشتباه کردید.احتیاجی نیست که viewPager  داخل آداپتر ببرید..فقط
دوست عزیز متغییر Base_position را در بیرون از متدها یعنی در سطح کلاس به صورت سراسری تا در تمام متدها بتونیدش استفاده کنید...مثلا در بالای تابع oncreate
کد پی‌اچ‌پی:
public class Eshgh_ImageShow extends ActionBarActivity {

 
int Base_position=0;//به صورت سراسری
    
@Override
    
protected void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        
setTitle("عشقولانه");
//کل کدهای ویو پیجر بیار اینجا بنویس.


یعنی تمامی کدهای ViewPager که داخل OnItemSelected نوشتی رو پاک کن ببرداخل تابع oncreate
یعنی فقط کافیه Base_position به صورت سراسری تعریف کنی همین..
 
پاسخ
 سپاس شده توسط mfn100 ، admin ، شماره مجازی امارات ، تلگرام ضد فیلتر 2023


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان