ورود

View Full Version : سوال: فراخوانی تابع؟؟



ghamgin
چهارشنبه 09 تیر 1395, 08:41 صبح
سلام
من یک mainactivity دارم که داخلش تابع با نام send رو ایجاد کردم یه اکتیویتی دیگر دارم از نوع دیالوگ که با زدن باتن باتن از اکتیویتی اول دیالوگ مربوطه باز میشه میخوام توی اکتیویتی دومی تابع send رو صدا بزنم برا همینم توی دومی نوشتم
Public mainactivity n
n.send ();
خطا ندارم اما برنامه در اجرا با زدن کلید send دیالوگ که کد بالا داخلشه force close میشه
کسی ميدونه چرا؟؟

vahid-p
چهارشنبه 09 تیر 1395, 15:47 عصر
در اندروید بیشترین Force close به دلیل ایجاد connection در thread اصلی است. که بارها از سوی کاربران مختلف مطرح شده.

send چیکار میکنه؟ ارتباط شبکه برقرار میکنه؟
شما نمیتونید مستقیم از داخل متد send و در thread اصلی connection بزنید، پست 17 این تاپیک رو بخونید و از کلاس AsyncTask استفاده کنید:
http://barnamenevis.org/showthread.p...=1#post2325690 (http://barnamenevis.org/showthread.php?525085-%D8%AE%D9%88%D8%A7%D9%87%D8%B4-%D9%85%DB%8C%DA%A9%D9%86%D9%85-%DB%8C%DA%A9%DB%8C-%DA%A9%D9%85%DA%A9-%DA%A9%D9%86%D9%87-(%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D8%A8%D8%A7-%D9%84%D9%88%DA%A9%D8%A7%D9%84-%D9%87%D8%A7%D8%B3%D8%AA)&p=2325690&viewfull=1#post2325690)
یه چیز دیگه چک کنید دسترسی <uses-permission android:name="android.permission.INTERNET"/> در فایل AndroidManifest.xml تون وجود داره.

اگر connection نزدید، کد رو بذارید بررسی بشه.

ghamgin
چهارشنبه 09 تیر 1395, 18:03 عصر
سلام در اکتیوتی اصلی کد چک اتصال اینترنت رو اینجوری نوشتم و صدا زدم بازم برنامه بسته شد خواهش میکنم بگید ایراد کجاست..؟؟؟

//-------------------------------------------------------------------------------
private class NetCheck extends AsyncTask<String,String,Boolean>
{
private ProgressDialog nDialog;
@Override
protected void onPreExecute(){
super.onPreExecute();
nDialog = new
ProgressDialog(MainActivity.this);
nDialog.setTitle("Checking Network");
nDialog.setMessage("Loading..");
nDialog.setIndeterminate(false);
nDialog.setCancelable(true);
nDialog.show();
}
//************************************************** *********
@Override
protected Boolean doInBackground(String... args){
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONN ECTIVITY_SERVICE);
NetworkInfo netInfo =cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected())
{
try {
URL url = new URL("http://www.google.com");
HttpURLConnection urlc =(HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(3000);
urlc.connect();
if (urlc.getResponseCode() == 200) {
return true;
}
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false;
}


@Override
protected void onPostExecute(Boolean th){
if(th == true){
nDialog.dismiss();
Toast.makeText(getApplicationContext(),
"دستگاه متصل است !",
Toast.LENGTH_SHORT).show();
// new GetData().execute();
}
else{
Toast toast = Toast.makeText(getApplicationContext(),
"خطا بعدا تلاش کنید", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
nDialog.dismiss();


}
}
//============================================
تابع send
public void send() {


new NetCheck().execute();

//my code;
}


و در اکتیویتی دوم
MainActivity a = new MainActivity();
a.send();

vahid-p
چهارشنبه 09 تیر 1395, 21:59 عصر
Persmission رو چک کردید؟

کدتون به نظر درست میاد

ghamgin
پنج شنبه 10 تیر 1395, 07:44 صبح
بله چک کردم درسته
شما راهی سراغ ندارید؟؟؟

vahid-p
پنج شنبه 10 تیر 1395, 08:48 صبح
اگه میتونید پوشه های src و res رو zip کنید بفرستید.

ghamgin
پنج شنبه 10 تیر 1395, 17:48 عصر
حجمش بالاست
ببینید من یه کلاس به فرم
class CustomDialog extends Dialog implements
دارم که توش برا دوتا باتن ارسال و انصراف دیالوگ کد داره
public void onClick(View v) {

switch (v.getId()) {
case R.id.btn_yes:
// m.sendmail();
//m.sendmail();
MainActivity act = new MainActivity();
act.send();
break;
case R.id.btn_no:
dismiss();
break;
default:
break;
}
dismiss();
}
}
من تابع send رو توی کد ارسال صدا زدم کدهاش رو هم خدمتتون فرستادم اما در اجرا برنامه بسته میشه
؟؟؟

پیشاپیش ممنون

vahid-p
پنج شنبه 10 تیر 1395, 20:22 عصر
گفتم که به نظر درست میاد. کد دومتون هم منطقی به نظر میاد.

این فایل ها رو برام بفرستید:
کدهای تمام کلاس هاتون با فرمت java
کدهای XML مربوط به layout ها.
و فایل AndroidManifest.xml

کل پروژه مطمئنا حجیم نیست اگر عکس همراهش نباشه و پوشه های Build رو هم حذف کنی. ولی همون سه مورد فوق رو بفرستی خوبه.

ghamgin
جمعه 11 تیر 1395, 12:29 عصر
بفرمایید
این کدهای من
141198

ghamgin
شنبه 12 تیر 1395, 08:24 صبح
کسی نظری نداره
؟؟؟؟؟؟؟؟؟؟

ghamgin
شنبه 12 تیر 1395, 19:10 عصر
ای بابا هیچ کس نیست بگه چکار کنم
یکی بیاد نجاتم بده...:گریه::عصبانی++:

vahid-p
یک شنبه 13 تیر 1395, 12:52 عصر
کدتون داغونه!!!
به جز اینکه یه سری اشتباهات داره که نمیدونم چطور اصلا کامپایلش کردید، حتی کاملش رو نفرستادید. الان مثلا sendlayout کجاست؟

شما اگر از IDE اندروید استدیو استفاده میکنید خودش این خطا ها رو بهت میگه.

یا تو کد زیر else چی میگه این وسط؟
public void send() {

new NetCheck().execute();
{
LayoutInflater factory = getLayoutInflater();
View editname = factory.inflate(R.layout.sendlayout, null);

etname = (EditText) editname.findViewById(R.id.editname);
String name = etname.getText().toString();


etmail = (EditText) editname.findViewById(R.id.editemail);
String mail = etname.getText().toString();


Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL, new String[]{"recipient@example.com"});
i.putExtra(Intent.EXTRA_SUBJECT, mail);
i.putExtra(Intent.EXTRA_TEXT, name);


Bundle b = this.getIntent().getExtras();
if (b != null) {

b.putString("fname", name);
b.putString("Email", mail);

startActivityForResult(i, 0);

}
try {
startActivity(Intent.createChooser(i, "Send ..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MainActivity.this, "not.", Toast.LENGTH_SHORT).show();
}
}
else
{

Toast.makeText(MainActivity.this, "خطا در اتصال", Toast.LENGTH_SHORT).show();
}
}

}

من که چنین کدی رو بررسی نمیکنم. به صورت فایل txt هم نفرستید به هیچ وجه. پوشه های src و res (شامل layout و string و values) و همچنین AndroidManifest.xml .
شما کل پروژه رو به جز فولدرهای به اسم build رو zip کنید و بفرستید (اگر از اندروید استدیو استفاده میکنید، یک پوشه build در مسیر اصلی کنار پوشه های app و gradle و... وجود داره و یکی داخل پوشه app که چندین مگ حجمشونه)

موفق باشید

ghamgin
دوشنبه 14 تیر 1395, 19:29 عصر
اینم کدها
141246

spiderman200700
چهارشنبه 16 تیر 1395, 13:29 عصر
سلام.
بعه جای این دو خط:

MainActivity act = new MainActivity();
act.send();


این خط رو بنویس:

c.send();

ghamgin
پنج شنبه 17 تیر 1395, 08:04 صبح
سلام
ممنونم ازتون
اما
جواب نداد اصلا هر تابع دیگه از هر اکتیویتی دیگه هم که صدا میزنم نميشه و force close میشه؟؟؟

vahid-p
پنج شنبه 17 تیر 1395, 17:30 عصر
جواب نداد اصلا هر تابع دیگه از هر اکتیویتی دیگه هم که صدا میزنم نميشه و force close میشه؟؟؟
برای من فورس کلوزش به خاطر NullPointerException هست. مثل اینکه getContext مقدار null رو بر میگردونه.
نتونستم زیاد روش وقت بذارم، مطمئن نیستم ولی شاید Dialog که روی Activity باز میکنی این مقدار رو تغییر میده. به نظرم در Activity اول context رو یه جا ذخیره کن و از getApplicationContext تو متد send استفاده نکن و مستقیم از اون مقدار قبلی استفاده کن. ببین جواب میده.

ghamgin
پنج شنبه 17 تیر 1395, 18:56 عصر
اصلا
راهی دیگه ای هست که از تابع استفاده نکنم و بتونم مستقیم کلید ارسال دیالوگ رو که زدم ارسال انجام شه یعنی تابع فراخوانی نشه و مستقیم بشه کد send رو اجرا کنم؟؟؟

spiderman200700
جمعه 18 تیر 1395, 10:55 صبح
بعد از این که force close داد. Logcat رو اینجا قرار بده که ببینم مشکل از کجاس

spiderman200700
جمعه 18 تیر 1395, 10:57 صبح
اصلا
راهی دیگه ای هست که از تابع استفاده نکنم و بتونم مستقیم کلید ارسال دیالوگ رو که زدم ارسال انجام شه یعنی تابع فراخوانی نشه و مستقیم بشه کد send رو اجرا کنم؟؟؟

میتونی متد send و بقیه متد های وابسته بهش رو داخل کلاس Send قرار بدی.

ghamgin
جمعه 18 تیر 1395, 19:49 عصر
سلام
اینم Logcat
در ضمن کل متد send رو داخل یه کلاس گذاشتم و صدا زدم باز نشد

C/dalvikvm(1591): Unable to open stack trace file '/data/anr/traces.txt': Is a directory
W/dalvikvm(1591): threadid=1: thread exiting with uncaught exception (group=0xa000f180)
C/AndroidRuntime(1592): FATAL EXCEPTION: main
C/AndroidRuntime(1592): java.lang.NullPointerException
C/AndroidRuntime(1592): at android.app.Activity.getLayoutInflater(Activity.ja va:3123)
C/AndroidRuntime(1592): at com.example.ds.MainActivity.sendm(MainActivity.jav a:47)
C/AndroidRuntime(1592): at com.example.ds.Send.onClick(Send.java:44)
C/AndroidRuntime(1592): at android.view.View.performClick(View.java:3511)
C/AndroidRuntime(1592): at android.view.View$PerformClick.run(View.java:14105 )
C/AndroidRuntime(1592): at android.os.Handler.handleCallback(Handler.java:605 )
C/AndroidRuntime(1592): at android.os.Handler.dispatchMessage(Handler.java:92 )
C/AndroidRuntime(1592): at android.os.Looper.loop(Looper.java:137)
C/AndroidRuntime(1592): at android.app.ActivityThread.main(ActivityThread.jav a:4424)
C/AndroidRuntime(1592): at java.lang.reflect.Method.invokeNative(Native Method)
C/AndroidRuntime(1592): at java.lang.reflect.Method.invoke(Method.java:511)
C/AndroidRuntime(1592): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:784)
C/AndroidRuntime(1592): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:551)
C/AndroidRuntime(1592): at dalvik.system.NativeStart.main(Native Method)
ممنون

ghamgin
جمعه 18 تیر 1395, 19:50 عصر
سلام
اینم Logcat
در ضمن کل متد send رو داخل یه کلاس گذاشتم و صدا زدم باز نشد


C/dalvikvm(1591): Unable to open stack trace file '/data/anr/traces.txt': Is a directory
W/dalvikvm(1591): threadid=1: thread exiting with uncaught exception (group=0xa000f180)
C/AndroidRuntime(1592): FATAL EXCEPTION: main
C/AndroidRuntime(1592): java.lang.NullPointerException
C/AndroidRuntime(1592): at android.app.Activity.getLayoutInflater(Activity.ja va:3123)
C/AndroidRuntime(1592): at com.example.ds.MainActivity.sendm(MainActivity.jav a:47)
C/AndroidRuntime(1592): at com.example.ds.Send.onClick(Send.java:44)
C/AndroidRuntime(1592): at android.view.View.performClick(View.java:3511)
C/AndroidRuntime(1592): at android.view.View$PerformClick.run(View.java:14105 )
C/AndroidRuntime(1592): at android.os.Handler.handleCallback(Handler.java:605 )
C/AndroidRuntime(1592): at android.os.Handler.dispatchMessage(Handler.java:92 )
C/AndroidRuntime(1592): at android.os.Looper.loop(Looper.java:137)
C/AndroidRuntime(1592): at android.app.ActivityThread.main(ActivityThread.jav a:4424)
C/AndroidRuntime(1592): at java.lang.reflect.Method.invokeNative(Native Method)
C/AndroidRuntime(1592): at java.lang.reflect.Method.invoke(Method.java:511)
C/AndroidRuntime(1592): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:784)
C/AndroidRuntime(1592): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:551)
C/AndroidRuntime(1592): at dalvik.system.NativeStart.main(Native Method)
ممنون

spiderman200700
شنبه 19 تیر 1395, 17:30 عصر
مشکل از این خطه:

LayoutInflater factory = getLayoutInflater();



LayoutInflater رو اینجوری بگیر:


LayoutInflater inflater = LayoutInflater.from(context);

به جای context هم context اکتیویتی جاری رو بده بهش.

spiderman200700
شنبه 19 تیر 1395, 17:31 عصر
لطفا برای تشکر کردن از دکمه "تشکر کردن" استفاده کنید.
با احترام

ghamgin
شنبه 19 تیر 1395, 17:43 عصر
مشکل از این خطه:

LayoutInflater factory = getLayoutInflater();



LayoutInflater رو اینجوری بگیر:


LayoutInflater inflater = LayoutInflater.from(context);

به جای context هم context اکتیویتی جاری رو بده بهش.

ضمن تشکر از توجه تون
به جای contextنوشتم this
اما نشد باز بسته شد
logcat


C/AndroidRuntime(1851): FATAL EXCEPTION: main
C/AndroidRuntime(1851): java.lang.IllegalStateException: System services not available to Activities before onCreate()
C/AndroidRuntime(1851): at android.app.Activity.getSystemService(Activity.jav a:3989)
C/AndroidRuntime(1851): at android.view.LayoutInflater.from(LayoutInflater.ja va:210)
C/AndroidRuntime(1851): at com.example.ds.MainActivity.sendm(MainActivity.jav a:48)
C/AndroidRuntime(1851): at com.example.ds.Send.onClick(Send.java:44)
C/AndroidRuntime(1851): at android.view.View.performClick(View.java:3511)
C/AndroidRuntime(1851): at android.view.View$PerformClick.run(View.java:14105 )
C/AndroidRuntime(1851): at android.os.Handler.handleCallback(Handler.java:605 )
C/AndroidRuntime(1851): at android.os.Handler.dispatchMessage(Handler.java:92 )
C/AndroidRuntime(1851): at android.os.Looper.loop(Looper.java:137)
C/AndroidRuntime(1851): at android.app.ActivityThread.main(ActivityThread.jav a:4424)
C/AndroidRuntime(1851): at java.lang.reflect.Method.invokeNative(Native Method)
C/AndroidRuntime(1851): at java.lang.reflect.Method.invoke(Method.java:511)
C/AndroidRuntime(1851): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:784)
C/AndroidRuntime(1851): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:551)
C/AndroidRuntime(1851): at dalvik.system.NativeStart.main(Native Method)

ghamgin
یک شنبه 20 تیر 1395, 09:57 صبح
خواهشا یکی جواب اخر و بده هر کاری می کنم نمیشه اصلا هیچ تابعی رو نمیشه صدا زد
بلد بودم که اینقدر نمیپرسیدم
قصد راحت طلبی که ندارم
نمیشه که نمی شه..

spiderman200700
یک شنبه 20 تیر 1395, 16:45 عصر
با توجه به ایپن حط از Logcat :

C/AndroidRuntime(1851): java.lang.IllegalStateException: System services not available to Activities before onCreate()

شما قبل از OnCreate داری این خط:

LayoutInflater inflater = LayoutInflater.from(context);



رو اجرا میکنی.

ظاهرا توی تغییراتی که دادی یه مشکلاتی هست.

کد های جدیدت رو بفرست تا ببینمشون

ghamgin
یک شنبه 20 تیر 1395, 18:36 عصر
هیچ تغییری ندادم
اینم کدها
به جای context هم this نوشتم اما نشد

package com.example.ds;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;



import android.support.v7.app.ActionBarActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends ActionBarActivity {

EditText etfamil;
EditText etname;
EditText etmail;
EditText etmatn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

// send mail
public void sendm() {

//ShowAlertDialogcheck();
if(isNetworkCheck())
// new NetCheck().execute();
{

LayoutInflater factory = getLayoutInflater();

View editname = factory.inflate(R.layout.login,null);

etname = (EditText) editname.findViewById(R.id.editname);
String name = etname.getText().toString();

etfamil = (EditText) editname.findViewById(R.id.editfamil);
String famil = etname.getText().toString();

etmail = (EditText) editname.findViewById(R.id.editemail);
String mail = etname.getText().toString();

etmatn = (EditText) editname.findViewById(R.id.editmatn);
String matn = etname.getText().toString();



Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"recipient@example.com"});
i.putExtra(Intent.EXTRA_SUBJECT, mail);
i.putExtra(Intent.EXTRA_TEXT , name+famil);
i.putExtra(Intent.EXTRA_TEXT , matn);

Bundle b=this.getIntent().getExtras();
if(b!=null)
{

b.putString("fname", name);
b.putString("lanme", famil);
b.putString("Email", mail);
b.putString("matn", matn);
startActivityForResult(i, 0);

}
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
}
else
{

Toast.makeText(MainActivity.this, "در اتصال خطا رخ داده است لطفا بعدا تلاش کنید", Toast.LENGTH_SHORT).show();
}


}

//----------------------------------------------------------------
private boolean isNetworkCheck(){
ConnectivityManager cm1 = (ConnectivityManager)getSystemService(Context.CONN ECTIVITY_SERVICE);
NetworkInfo ni=cm1.getActiveNetworkInfo();
if(ni==null)
{
return false;
}else
{
return true;
}

}

//-------------------------------------------------------------------------------
private class NetCheck extends AsyncTask<String,String,Boolean>
{
private ProgressDialog nDialog;
@Override
protected void onPreExecute(){
super.onPreExecute();
nDialog = new
ProgressDialog(MainActivity.this);
nDialog.setTitle("Checking Network");
nDialog.setMessage("Loading..");
nDialog.setIndeterminate(false);
nDialog.setCancelable(true);
nDialog.show();
}
//************************************************** *********
@Override
protected Boolean doInBackground(String... args){
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONN ECTIVITY_SERVICE);
NetworkInfo netInfo =cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected())
{
try {
URL url = new URL("http://www.google.com");
HttpURLConnection urlc =(HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(3000);
urlc.connect();
if (urlc.getResponseCode() == 200) {
return true;
}
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false;
}


@Override
protected void onPostExecute(Boolean th){
if(th == true){
nDialog.dismiss();
Toast.makeText(getApplicationContext(),
"دستگاه شما به اینترنت متصل است !",
Toast.LENGTH_SHORT).show();
// new GetData().execute();
}
else{
Toast toast = Toast.makeText(getApplicationContext(),
"در اتصال خطا رخ داده است لطفا بعدا تلاش کنید", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
nDialog.dismiss();

//ShowAlertDialogcheck();
}
}
//============================================

}

//menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.item1:

return true;
case R.id.item2:

Send se=new Send(MainActivity.this);
se.show();

return true;
case R.id.item3:

return true;
default:
return super.onOptionsItemSelected(item);
}
}



}

spiderman200700
یک شنبه 20 تیر 1395, 19:30 عصر
کلاس Send هم نیازه.
توی متد onClick در Send چکار کردن الان؟

ghamgin
دوشنبه 21 تیر 1395, 07:45 صبح
کلاس send که همونه تغیری نکرده همون کلاس نمایش دیالوگ که فرستادم در زیر قبلی
توی کد کلید ارسال فقط اونو نوشتم که در اجرا با زدن باتن ارسال دیالوگ نمایش داده شده برنامه بسته میشه
این نوشتم
Mainactivity a=new Mainactivity ();
a.sendm ();

spiderman200700
دوشنبه 21 تیر 1395, 11:42 صبح
دوست عزیز شما نمیتونی اکتیویتی رو اینجوری ایجاد کنی.
قبلا هم گفتم به جای a.sendm (); این کد رو بنویسین c.sendm ();

ghamgin
دوشنبه 21 تیر 1395, 12:13 عصر
ممنونم مرسی
فقط خوب مگه c این نیست منظورتون که بالای کلاس send تعریف کردم
public Activity c;
؟؟
خوب من می نویسم طوری که شما میگید باز برنامه بسته می شه
؟؟؟؟؟؟؟؟؟؟

spiderman200700
دوشنبه 21 تیر 1395, 18:11 عصر
نباید بسته بشه.
اگه خواستی کل پروژه رو برام بفرست تا بررسی کنم ببینم مشکل کجاست.

ghamgin
سه شنبه 22 تیر 1395, 08:17 صبح
ببینید پروژه چیز خاصی نداره فقط دو تا کلاس main و send هست که کدها رو گفتم
اصلا اینی که شما میگید
C.send ();
رو نمیشناسه و روش خطا داره بعدش که روش میرم cast میکنم به اکتیو main اجرا که کردم باز بسته شد
؟!...

vahid-p
سه شنبه 22 تیر 1395, 13:50 عصر
بعضی وقت ها لازمه وقتی از یه قسمت برنامه جواب نمیگیری، اون قسمت رو از اول بنویسی و سعی کنی از یه روش دیگه بری.

شما صورت مسئله رو به صورت ساده توضیح بدید قراره چه کاری انجام بشه، ببینیم میتونیم بنویسیم و بفرستیم. چون الان وقت زیادی رو این کد صرف شده و خود شما هم مطمئنا خسته شدید از اینکه نمیتونید مشکلش رو حل کنید.

برداشت من:
قراره با کلیک بر روی یک دکمه یک دیالوگ باز بشه (نه اکتیویتی) و اطلاعاتی در دیالوگ گرفته بشه و برای یک آدرس بفرسته. درسته؟

ghamgin
سه شنبه 22 تیر 1395, 16:52 عصر
بله دقیقا
قراره با کلیک بر روی یک دکمه یک دیالوگ باز بشه و اطلاعاتی در دیالوگ گرفته بشه و برای یک آدرس بفرسته. توسط یک کلاس

ghamgin
چهارشنبه 23 تیر 1395, 12:09 عصر
یعنی در واقع
همون کلاس send دیالوگ رو باز میکه
و در داخل کلیک باتن ارسالش من دارم تابع sendmail که ایمیل رو میفرسته رو صدا میزنم از داخل اکتیویتی اصلی برنامه

vahid-p
چهارشنبه 23 تیر 1395, 13:37 عصر
کد پروژه رو ضمیمه کردم.
برای service.php که آدرسش در SendData.java نوشتم کد ساده زیر:

<?phpecho 'Your firstname is "'.$_POST['fname'].'" and your last name is "'.$_POST['lname'].'"';?>

به راحتی از کد جواب گرفتم، مهم نیست متد send کجا باشه ...

ghamgin
چهارشنبه 23 تیر 1395, 19:25 عصر
ممنون از وقتی که گذاشتید
اما
جسارتا
من کاری به سرویس ندارم که بخوام براش کد php
بنویسم کد ارسال ایمیلم اینه

public void sendm() {

//ShowAlertDialogcheck();
if(isNetworkCheck())
// new NetCheck().execute();
{

LayoutInflater factory = getLayoutInflater();

View editname = factory.inflate(R.layout.login,null);

etname = (EditText) editname.findViewById(R.id.editname);
String name = etname.getText().toString();

etfamil = (EditText) editname.findViewById(R.id.editfamil);
String famil = etname.getText().toString();

etmail = (EditText) editname.findViewById(R.id.editemail);
String mail = etname.getText().toString();

etmatn = (EditText) editname.findViewById(R.id.editmatn);
String matn = etname.getText().toString();



Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"recipient@example.com"});
i.putExtra(Intent.EXTRA_SUBJECT, mail);
i.putExtra(Intent.EXTRA_TEXT , name+famil);
i.putExtra(Intent.EXTRA_TEXT , matn);

Bundle b=this.getIntent().getExtras();
if(b!=null)
{

b.putString("fname", name);
b.putString("lanme", famil);
b.putString("Email", mail);
b.putString("matn", matn);
startActivityForResult(i, 0);

}
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
}
else
{
Toast.makeText(MainActivity.this, "در اتصال خطا رخ داده است لطفا بعدا تلاش کنید", Toast.LENGTH_SHORT).show();
}


}
که توی یه تابع در اکتیویتی اصلی برنامه است و من میخوام از اکتیویتی دومم که دیالوگ رو باز میکنه و کلید ارسال داخلش هست بتونم این تابع رو صدا بزنم و ارسال رو انجام بدم

vahid-p
چهارشنبه 23 تیر 1395, 21:33 عصر
گفتم که صورت مسئله رو دقیق مشخص کنید (که در پست اولی گفتید اطلاعاتی رو به یک آدرس بفرسته و پست دوم رو ندیده بودم)

اما چرا روی این عبارت تاکید دارید که

که توی یه تابع در اکتیویتی اصلی برنامه است و من میخوام از اکتیویتی دومم که دیالوگ رو باز میکنه و کلید ارسال داخلش هست بتونم این تابع رو صدا بزنم و ارسال رو انجام بدم
یعنی حتما باید تابع تو یه کلاس دیگه باشه با این جزئیاتی که چندین بار تکرار کردید؟
اصلا این چه اهمیتی داره؟
مگر اطلاعاتی که در دیالوگ گرفته میشه به صورت ایمیل ارسال بشه چیزی نیست که میخواید؟
خب توضیحات صدا زدن این متد از فلان کلاس برای چیه؟!!

من میخوام بدونم نیازمندی برنامه چیه، نه برنامه به چه صورت پیاده سازی بشه، چون اگر من دقیقا اونجوری پیاده سازی کنم که شما میگید میشه همون برنامه ای که نوشتید. و شاید اشتباه شما هم همینه که اصرار دارید حتما از این مسیر که رفتید ادامه بدید!!!

ghamgin
پنج شنبه 24 تیر 1395, 07:59 صبح
سلام
ببخشید
نه هیچ اصراری نیست که تابع ارسال ایمیل در کلاس دیگر باشه
آخه من با علم ناقصم هرکاری کردم نشد تابع ارسال در همون اکتیویتی دیالوگ باشه ارور داد روی startactivity منم در اکتیویتی اصلی برنامه نوشتم و اومدم صداش بزنم که نشد
روش دیگه ای نميدونم
اگه از alert dialog خود اندروید بدون سفارشی سازی استفاده کنم مشکلی نداشت اما ميخواستم باتن ها سفارشی باشه که به مشکل خورد...واسه کد ارسال ایمیل باتن
ممنون میشم راه دیگر ای داره بگید.

vahid-p
پنج شنبه 24 تیر 1395, 10:17 صبح
در کلاس SendData از پروژه ای که فرستادم رویداد submitBtn رو تغییر بدید به :
submitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent mailApps=new Intent(Intent.ACTION_SEND);
mailApps.setType("message/rfc822");
mailApps.putExtra(Intent.EXTRA_EMAIL , new String[]{"email@example.com"});
mailApps.putExtra(Intent.EXTRA_SUBJECT, "Email Subject");
mailApps.putExtra(Intent.EXTRA_TEXT , "First name:"+fName.getText().toString()+"<br />Last name:"+lName.getText().toString());
try {
activity.startActivity(Intent.createChooser(mailAp ps, "Send Mail"));
}catch(ActivityNotFoundException ex){
Toast.makeText(getContext(),"Not found any application to send mail!",Toast.LENGTH_LONG);
}
}
});

ghamgin
پنج شنبه 24 تیر 1395, 17:47 عصر
سلام واقعا ممنونم
کاش میشد هزار بار کلید تشکر رو زد
مرسی:تشویق::تشویق::تشویق:
پس کلا نمیشه یه تابع در اکتیویتی اصلی نوشت و در اکتیویتی های دیگه صدا زد درسته؟
و اینکه اگه قبل از ارسال ایمیل بخوام اتصال به نت رو چک کنم
این تابع رو توی همون کلاس senddata این تابع رو نوشتم

private boolean isNetworkCheck(){
ConnectivityManager cm1 = (ConnectivityManager)getSystemService(Context.CONN ECTIVITY_SERVICE);
NetworkInfo ni=cm1.getActiveNetworkInfo();
if(ni==null)
{
return false;
}else
{
return true;
}

}
که با یه شرط قبل ارسال اتصال چک شه اما روی
getSystemService
ارور میده میگه create method کنم
در صورتیکه همین تابع در اکتیویتی اصلی erorr نداره
میشه بی زحمت این مشکل رو هم بگید
مرسی بازم

vahid-p
جمعه 25 تیر 1395, 12:48 عصر
پس کلا نمیشه یه تابع در اکتیویتی اصلی نوشت و در اکتیویتی های دیگه صدا زد درسته؟
میشه. مشکل از یه جا دیگست احتمالا. برای همین گفتم یه بار دیگه این قسمت برنامه رو بنویس.


که با یه شرط قبل ارسال اتصال چک شه اما روی
getSystemService
ارور میده میگه create method کنم
خب این متد برای Dialog وجود نداره و برای Activity وجود داره. و برای همین هم ما در Dialog یه اشاره گر به Activity اصلی تعریف کردیم که بتونیم به متدهاش دسترسی داشته باشیم.
در نتیجه متدت رو به این صورت بنویس:
private boolean isNetworkCheck() { ConnectivityManager cm1 = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SER VICE);
NetworkInfo ni = cm1.getActiveNetworkInfo();
if(ni!=null && ni.isConnected()){
return true;
}
return false;
}
شما متدهایی که تو اینترنت میبینید استفاده شده اکثرا در کلاس ارث بری شده از Activity نوشتن و مستقیم از این متدها استفاده کنی و خیلی از این متدها رو Dialog نداره باید از activity استفاده کنی به این صورت که نوشتم.
میتونی اینو به یه کلاس دیگه بدی یا Activity رو به صورت singleton در بیاری و هر جایی ازش استفاده کنی. و یک کلاس دیگه فقط برای انجام اینکارها باشه، و فقط کلاسهای Activity و Dialog برای گرافیک باشن و نخوان وارد جزئیات ارسال ایمیل و ارتباط اینترنتی و... باشن. اما در حال حاضر همینی که هست کفایت میکنه.

ghamgin
جمعه 25 تیر 1395, 20:20 عصر
ممنونم ازتون مرسی درست شد دقت نکرده بودم
فقط اگه ایرادی نداره میخواستم بدونم
من اومد پیغام بدم مثلا اینترنت وصل نیست
این خط رو نوشتم

Toast.makeText(MainActivity.this, "در اتصال خطا رخ داده است بعدا تلاش کنید", Toast.LENGTH_SHORT).show();
اما روی mainactivity خطا داد
من مثل شما activity.this نوشتم نشد خطا داد
مگه نباید از این به بعد برا اینجور استفاده ها بنویسم activity. فلان
؟؟؟؟

مرسی

vahid-p
شنبه 26 تیر 1395, 14:35 عصر
ببینید this متد نیست که. ما this.activity داریم ولی activity.this ندارم. this روی آبجکت اعمال نمیشه، روی کلاس اعمال میشه و منظورش آبجکت فعلی از اون کلاس.
در listener البته اگر this بنویسید منظور همون listener است نه کلاس بیرونی.

خب برای مدت Toast.makeText باید ببینیم چی میخواد:
اولین پارامتر Context است. باید آبجکتی از نوع Context براش پیدا کنیم.
خب خود کلاس Dialog متد getContext داره. پس به راحتی مثل کدی که در SendData هم نمونش بود:
Toast.makeText(getContext(), "Not found any application to send mail!", Toast.LENGTH_LONG);
getContext

در کلاس MainActivity کدی که نوشتی درسته. ولی در کلاس SendData هر چند نیازی به activity نیست چون Dialog خودش متد getContext داره. جایی گفتم از activity استفاده کن که Dialog خودش نداره، و البته میتونی از هر دو استفاده کنی ولی فکر کنم اگر از activity استفاده کنی در حالی که Dialog هم باشه پشت Dialog نمایش بده. این موضوع رو دقیق نمیدونم عملا تفاوتشون چیه و اینکه Context کدوم باشه مهمه یا نه (اینو باید بری در جاواداک Toast.makeText بخونی)

در کلاس SendData هر سه این موارد جواب میدن: (ببین تفاوتی دارن یا نه)
Toast.makeText(activity,"Error in Connection",Toast.LENGTH_SHORT).show();
Toast.makeText(activity.getApplicationContext(),"Error in Connection",Toast.LENGTH_SHORT).show();
Toast.makeText(getContext(),"Error in Connection",Toast.LENGTH_SHORT).show();
اینکه activity مستقیما میتونی به جای Context استفاده کنی چون خودش از Context ارث برده.

راستی متد show() بعد از makeText فراموش نشه. کلاس SendData تصحیح کن، فراموش شده :|

موفق باشید.

ghamgin
یک شنبه 27 تیر 1395, 10:19 صبح
سلام استاد عزیز
خیلی ازتون ممنونم
ببخشید از کجا باید بدونم چه کلاسی چه متدهایی داره مثلا این که dialog متد getcontext رو داره و ...
و ببخشید میدانم اینجا جاش نیست
ولی این view چیه که من وقتی میپرسم میخواهم فایل . Cs رو در ادیت ویو لود کنم با استایل میگن باید ویو ایجاد کنم!
بازم ممنونم

vahid-p
یک شنبه 27 تیر 1395, 12:19 عصر
ببخشید از کجا باید بدونم چه کلاسی چه متدهایی داره مثلا این که dialog متد getcontext رو داره و ...
به چند طریق:
1- مطالعه JavaDoc مربوط به کلاس که تمام فیلدها و متدها (بعلاوه متدهایی که از کلاس های پدر به ارث برده) رو میتونی ببینی
2- اکثر IDE ها اجازه میدن به راحتی با Ctrl و کلیک بر روی اسم کلاس یا متد به محل تعریفش بری (Android Studio Tips & Tricks: Moving Around (http://www.developerphil.com/android-studio-tips-tricks-moving-around/#goto-declaration)). خب چه از Android Studio استفاده کنی چه Eclipse و Netbeans ... این امکان رو بهتون میدن. برای اینکه خلاصه متدها و فیلدها رو ببینی پست دوم: http://stackoverflow.com/questions/18305791/android-studio-intellij-idea-table-of-contents-for-a-class
ضمنا کافیه شما اگر آبجکتتون از نوع Dialog هست (یا ارث برده از Dialog) با "." خود IDE تمام گزینه های مجاز رو بهتون نشون میده. اگر داخل کلاس هستید بنویسید: this. و خودش تمام متدها و فیلدهای در دسترس رو نشون میده. البته به این نکته توجه کنید برای آبجکت متدهای استاتیک نشون داده نمیشه و باید اسم کلاس رو وارد کنی و "." که اونوقت فقط متدهای استاتیک رو میتونی ببینی (بعلاوه فیلدها)
3- خیلی وقت ها از روی اسم متد و جاواداک نمیتونی استفاده از اونها رو بفهمی و حتما باید آموزش یا مثالی از اون رو ببینی.


ولی این view چیه که من وقتی میپرسم میخواهم فایل . Cs رو در ادیت ویو لود کنم با استایل میگن باید ویو ایجاد کنم!
نمیدونم EditView چیه. سرچ بزن، اینم شاید به کارت بیاد:http://www.vogella.com/tutorials/AndroidCustomViews/article.html

موفق باشید.

ghamgin
دوشنبه 28 تیر 1395, 08:53 صبح
ببخشید منظورم همون edit text بود
ممنونم خیلی راهنمایی کردید
یه دنیا سپاس

ghamgin
دوشنبه 28 تیر 1395, 11:44 صبح
سلام ببخشید تو رو خدا یه مشکل تازه
من میخوام متن داخل textview رو با زدن یه کلید و باز شدن یه دیالوگ به extview دیالوگ بفرستم این کدها رو در دیالوگ نوشتم


LayoutInflater factory2 = getLayoutInflater();
View editcode = factory2.inflate(R.layout.activity_main,null);
code = (EditText) findViewById(R.id.editcode1);

coding=code.getText().toString();


di.setText(coding);

Bundle extra=activity.getIntent().getExtras();
String n;
n=extra.getString("nam5");
di.setText(n);
String get=di.getText().toString();

و این رو در باتن اکتیویتی اصلی که میخوام با زدنش دیالوگ باز شه و متنم رو به دیالوگ بفرسته نوشتم

String n;
String nam=coding;
n=nam.toString();
startActivity(new Intent(MainActivity.this, Ostan.class));
Intent mIntent = new Intent(MainActivity.this,Dialogsave.class);
mIntent.putExtra("nam5", n);
startActivity(mIntent);
اما در اجرا برنامه باز بسته میشه
میشه کمک کنید
؟؟؟ :ناراحت:

ghamgin
چهارشنبه 30 تیر 1395, 07:20 صبح
دوستان کسی راهی برای ارسال داده از اکتیویتی به دیالوگ نداره؟؟