اذهب إلى المحتوى

Flutter Dev

الأعضاء
  • المساهمات

    787
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    2

أجوبة بواسطة Flutter Dev

  1. بتاريخ 6 دقائق مضت قال مصطفى القباني:

    تحياتي أستاذ مروان

    في الكود يوجد جملة SQL وحيدة وهي عرضة للSQL injection وهي:

    
    $sql = "SELECT * FROM user WHERE phone='$phone' AND password='$password' ";

    وهي عرضة للSQL injection بسبب المتغيرات $password و $phone.

    لذلك عليك تجهيز هذه الجملة أولا عن طريق الprepared statements.

    نقوم بتجهيز الجملة بوضع علامة إستفهام مكان المتغيرات كالآتي:

    
    $stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");

    وبعد ذلك نقوم بربط علامات الإستفهام بالمتغيرات التي نريد تمريرها إلى الجملة كالآتي:

    
    $stmt->bind_param("ss", $phone, $password);

    إذا كان المتغير phone$ من النوع int يجب تغيير الparameter الأول إلى "is" وتصبح الجملة كالآتي:

    
    $stmt->bind_param("is", $phone, $password);

    بالتالي يكون الكود الكامل لتجهيز الجملة وتنفيذها هو:

    
    $stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");
    $stmt->bind_param("ss", $phone, $password);
    $result $stmt->execute();

    ويمكنك التعامل مع الresult المرجعة.

    اهلا بك اخي الكريم

    في البداية ربي يعطيك الف صحه وعافيه عزيزي ويزيدك من واسع فضله من العلم باذن الله 

    اول نقطة افهمك من كلامك ان كل المشكلة في هذا اول 3 اسطر الي فيها الاستعلام فقط اما باقي الملف لا يتغير شكله سوى كان josn او لا.

    الان قمت بتطبيق ما ذكرته لي وظهر لي الخطا التالي 

    ( ! ) Parse error: syntax error, unexpected '$stmt' (T_VARIABLE) in C:\wamp64\www\login.php on line 10

    ويمكنك التعامل مع الresult المرجعة ... بنسبة ل هذا الي فهمته رح يبقا شكل الكود على ما هو عليه صحيح ذلك؟

     

     

    الكود كامل الان كالتالي:

     

    <?php
    
    
        	include 'conn.php';
        $phone = $_POST['phone'];
        $password = $_POST['password'];
    
    $stmt = $mysqli->prepare("SELECT * FROM user WHERE phone=? AND password=?");
    $stmt->bind_param("ss", $phone, $password);
    $result $stmt->execute();
    
       $response = mysqli_query($con , $sql);
    
       $result = array();
    
       $result['login'] = array();
      
    if ( mysqli_num_rows($response) === 1 ) {
            
         
    $row = mysqli_fetch_assoc($response);
    
                 
    $index['name'] = $row['name'];
               
     $index['phone'] = $row['phone'];
             
    	 
            array_push($result['login'], $index);
    
       
             $result['success'] = "1";
            
        $result['message'] = "success";
            
        echo json_encode($result);
    
      
              mysqli_close($mysqli );
    
          
        }
    
    
    
    ?>

     

  2. السلام عليكم ورحمة الله وبركاته

    اهلا ي اخوان ..

    اعتذر عن طرح استفسار من جديد بخصوص هذا الموضوع الاخوان سابقا جازهم الله خير شرحو الموضوع ولكني واجهة مشكله في تطبيق الشرح على الكود الخاص فيني ياليت اذا احد عنده الامكانيه والخبره يساعدنا

    احتاج تطبيق الفكره على الكود التالي:

    <?php
    
    if ($_SERVER['REQUEST_METHOD']=='POST') 
    {
        	include 'connt.php';
        $phone = $_POST['phone'];
        $password = $_POST['password'];
    
        
      $sql = "SELECT * FROM user WHERE phone='$phone' AND password='$password' ";
     
       $response = mysqli_query($con, $sql);
     
       $result = array();
     
       $result['login'] = array();
      
      
        if ( mysqli_num_rows($response) === 1 ) {
            
         
       $row = mysqli_fetch_assoc($response);
    
       
    
                
                $index['name'] = $row['name'];
               
     $index['phone'] = $row['phone'];
             
    	 
            array_push($result['login'], $index);
    
       
             $result['success'] = "1";
            
        $result['message'] = "success";
            
        echo json_encode($result);
    
      
              mysqli_close($con);
    
          
        }
    
    }
    
    ?>

     

     

    <?php
    
    
    $db_name = "XXXXX";
    $mysql_username = "root";
    $mysql_password = "";
    $server_name = "localhost";
    $con = mysqli_connect($server_name, $mysql_username, $mysql_password,$db_name);
     
    
    
    if($con){
    	
    	echo"connection OK";
    	
    }
    else{
    	
    echo	"conection not";
    }
    
    ?>
      

     

     

    لا اعلم اذا الموضوع رح يشكل فرق ولكني للعلم انا اتصل لدى هذا الكود من خلال مكتبة volley في اندرويد ك صفحة تسجيل دخول واحصل على بيانات المستخدم منها

  3. بتاريخ 4 ساعات قال مصطفى القباني:

    تحياتي أستاذ مروان
    في النموذج الأول، لنفرض أن المتغير $studentid قيمته تساوي الstring التالي:
    "1; DROP TABLE student;"
    وعند ترجمة الطلب الآتي: 

    
     $CheckSQL = "SELECT * FROM student WHERE studentid='$studentid'";
    

    يصبح:

    
    SELECT * FROM student WHERE studentid=1; DROP TABLE student;

    لذلك الكود به ثغرة sql injection.

    لتجنب ذلك لابد من إستخدام الprepared statements و parameterized queries.

    تنفيذ الprepared statement يكون على خطوتين، الأولى التجهيز prepare ثم التنفيذ execute.بما أنك تستخدم MySQLi يمكنك عمل ذلك عن طريق الآتي:

    
    $stmt = $mysqli->prepare("SELECT * FROM student WHERE studentid = ?")
    $stmt->bind_param('s', $studentid);
    $stmt->execute();
    $result = $stmt->get_result();
    

    في السطر الثاني ال's' تشير إلى أن نوع المتغير هو string، إذا كان studentid هو int عليك تغييره إلى 'i'.

    بهذه الطريقة تصبح العبارة آمنة، بسبب أن جزء الأمر مفصول عن جزء الداتا، والسبب في أي sql injection هو خلط البيانات بالأوامر، حيث يمكن تمرير أمر إلى الداتابيز في شكل داتا.

    أي أمر ترسله إلى الداتابيز سواء إضافة أو قراءة، ويكون في هذا الأمر parameter، يجب تجهيزه بهذه الطريقة.

    بالتوفيق

    وصلت عزيزي

    كل الشكر لك عزيزي

    بتاريخ 2 ساعات قال عبود سمير:

    مرحباً مروان ..
    للحماية من ثغرة SQL injection يُنصح دائما بإستعمال prepared statment و parameterized queries 

    فمثلا إن كنت تستخدم PDO تستعمل الشيفرة التالية:

    
    <?php
    
    $stmt = $pdo->prepare('SELECT * FROM table_name WHERE name = :name');
    $stmt->execute([ 'name' => $name ]);

    و إن كنت تستخدم  MySQLi تستعمل الشيفرة التالية:

    
    <?php
    
    $stmt = $dbConnection->prepare('SELECT * FROM table_name WHERE name = ?');
    $stmt->bind_param('s', $name); // 's' من أجل تعيين نوع المتغير => string
    
    $stmt->execute();

    و للحماية من xss أي Cross-Site Scripting يُنصح بإستعمال الفلترة و التعقيم  للبيانات التي تأتي من المُستخدم قبل تخزينها في قاعدة البيانات هناك قاعدة تقول لا تثق ابدا ً بمدخلات المستخدم 

    موضوع الحماية كبير جداً و إذا كنت تستخدم pure php بدون اي إطار عمل فسيتوجب عليك البحث عن الثغرات المشهورة و كيفية تجاوزها و تطبيق الحلول أما إن كنت تستخدم إطار عمل فستجد أنه قد تم توفير حلول لمُعظم الثغرات المشهورة من طرف مطورين الإطار 

    بالتوفيق

    ربي يعطيك الف صحه وعافيه عزيزي 

  4. ايضا هل انا مجبور اني اعدل كل ملفات مشروعي او فقط ملفات في مواقع محدده؟ يعني مثلا عندي ملفات تعرض لي البيانات في listview مثلا هل تحتاج حمايه؟او فقط اعدل الملفات الي فيها insert مثل صفحة تسجيل عضويه وصفحة دخول بمعنى فيه مكان لداخل البيانات؟

  5. السلام عليكم ورحمة الله وبركاته

    مرحبا ي اخوان.. لدي استفسار لو تكرمتو رح اضع نموذجين من ملفات  php واحتاج معرفة كيف ممكن احمي هذا النماذج من ثغرت SQL Injections

    انا استخدم قواعد mysql لحفظ بيانات تطبيقي اندرويد 

     

    النموذج الاول:

    <?php
    
    
    	include 'conntion.php';
    	$studentid = $_POST['studentid'];
    
     $CheckSQL = "SELECT * FROM student WHERE studentid='$studentid'";
     
     $check = mysqli_fetch_array(mysqli_query($con,$CheckSQL));
     
     if(isset($check)){
    
     echo 'studentid Already Exist';
    
     }
    else{ 
    
        $sql = "SELECT * FROM student";
    	
    
    
    
    
        if ( mysqli_query($con, $sql) ) {
            $result["success"] = "1";
            $result["message"] = "success";
    
            echo json_encode($result);
            mysqli_close($con);
    
        } else {
    
            $result["success"] = "0";
            $result["message"] = "error";
    
            echo json_encode($result);
            mysqli_close($con);
        }
    }
    	
    ?>

     

     

    النموذج الثاني:

     

    <?php
    
    
    	include 'conntion.php';
    	$query = " Select * FROM student WHERE IsActive = 5; ";
    	
    	$result = mysqli_query($con, $query);
    	$number_of_rows = mysqli_num_rows($result);
    	
    	$temp_array  = array();
    	
    	if($number_of_rows > 0) {
    		while ($row = mysqli_fetch_assoc($result)) {
    			$temp_array[] = $row;
    		}
    	}
    	
    	header('Content-Type: application/json');
    	echo json_encode(array("students"=>$temp_array));
    	mysqli_close($con);
    
    ?>

     

    ياليت يكون مع الشرح بشكل مختصر حتى افهم الفكره ولكم جزيل الشكر

  6. بتاريخ 40 دقائق مضت قال محمد ربيع زليول:

    بالنسبة للإدراج فهو غير مهم، الطريقة التي تقوم بها بإدراج التاريخ صحيحة.

    يجب تعديل التاريخ عند قرائته، في php يمكنك تعديل التاريخ بالطريقة التالية:

    
    <?php
    
    $str = '2020-07-08 18:18:27';
    
    echo date('g:i A', strtotime($str)); // 6:18 PM
    
    echo "\n";
    
    echo date('d/M/Y', strtotime($str)); // 08/Jul/2020
    
    ?>

     

     

    شكرا على ردك عزيزي انا حليت المشكله بشكل مختلف قليلا قمت بدراج الوقت بالكود التالي :

     SimpleDateFormat formatter = new SimpleDateFormat( "hh:mm:ss", Locale.US);
            Date date = new Date();

    في الخلفية بدون تدخل المستخدم وحفظه بتنسيق الي اريده وبطبيعة الحال سيعود بتنسيق الذي حفظته فيها 

     

    اكرر شكري لك عزيزي

    • أعجبني 1
  7. بتاريخ منذ ساعة مضت قال Hamada Sayed:

    جرب التشغيل علي استضافه محليه localhost علي حاسوبك 

     

    ممكن تكون سرعه نقل البيانات من الاستضافه المجانيه السبب في البطئ

     

    بالاضافه لنصائح محمد وصالح.

    شكرا لك عزيزي

    ولكن ياليت بس اعرف نقطة منك كيف اعرف سرعة نقل البيانات من خلال الخطة التي اشريها ؟ بماذا يرمز لها ؟

  8. السلام عليكم ورحمة الله وبركاته

    اقوم بحفظ الوقت من خلال ملف php الى قاعدة بيانات mysql من خلال الكود التالي:

    <?php
     
    	include 'con.php';
    
    		
    date_default_timezone_set("Asia/Muscat");  
    
    		$sql = "insert into student(time)values(now())";
    
    		if(mysqli_query($con, $sql))
    		{
    			
    			
    		} else {
    			
    		}
    		
    	
    	
    	mysqli_close($con);
    ?> 

    الان الوقت يصير له ادراج في قاعدة البيانات لا توجد مشكلة المشكلة فقط انه هو يعمل ادراج بنظام 24 ساعه . انا عامل حقل في قاعدة البيانات في جدول الطلاب باسم time وعامل نوع البيانات time

     

    وهذا صورة للمشكلة لتوضيح اكثر

     

    device-2020-07-19.thumb.png.776527449490942c85b9e5adea1144e4.png

     

     

    كيف يمكن تغير نظام حفظ الوقت الى نظام 12 ساعه بحيث لا يكون لدي ساعه 12-14-15 

    بل 1-2-3 

  9. بتاريخ الآن قال محمد بنرجب:

    بالنسبة للصور انصحك تستخدم صور متوافقة مع الهاتف و باحجام صغيرة و ليست صور ويب

    فمثلا صورة لمقال بموقع يكون حجمها كبير لانها ستضهر في شاشة كبيرة لكن في الهاتف الجوال فلا تحتاج صور بجودة عالية.

    نصحية جميله اشكرك عزيزي

  10. السلام عليكم ورحمة الله وبركاته

    لدي استفسار لو تكرمتو .. انا قمت بعمل تطبيق اندرويد في اندرويد ستوديو بلغة الجافا . 

    وقمت باستخدام مكتبة volley في جميع الاتصالات لني قريت انها سريعه قبل ما ابدي تطوير تطبيقي 

    ولكن الاحظ الان بعد جاهزية التطبيق تقريبا انه فيه نوعا من البطى في جلب الصور مثلا في قرائة وتحميل الصور 

    ايضا مثلا بعض الازار الاستجابة بطيئة مثل زر الاعجاب 

    ايضا جلب بعض الارقام والبيانات نوعا ما بطية 

     

    ما هيا الاسباب التي تودي لمثل ذلك ؟ علما ان تطبيقي على استضافة مجانية حاليا

  11. بتاريخ 7 ساعات قال عبود سمير:

    أظن أن الإستعلام سيكون نفسه فقط ستُغير طريقة العرض و لنفرض أنك قمت مسبقاً بتخزين لغة المُستخدم في متغير بهذا الشكل: 

    
    String lang = "...."; // ar or en

    و في الحلقة التي تقوم بها بعد جلب البيانات ستقوم بالتالي: 

    
    String imageUrl = hit.getString("name_" + lang);

    و بهذا الشكل سيتم عرض البيانات حسب لغة المُستخدم التي يتصفح بها التطبيق

    بالتوفيق

    شكرا لك عزيزي لقد نجح الامر حسب تعليماتك السابقه 

    • أعجبني 1
  12. بتاريخ 4 دقائق مضت قال عبود سمير:

    مرحباً مروان ...
    الفكرة أنك تقوم بتخزين الخانة التي تريد ترجمتها بأكثر من لغة في قاعدة البيانات مثلا name_ar و name_en بحيث في الخانة name_ar تُخزن الإسم باللغة العربية و في الخانة name_en تُخزن الإسم باللغة الإنجليزية و عندما تريد أن تعرض البيانات يُمكنك عرض الإسم حسب لغة المُستخدم .

    الفكرة الثانية أنك مثلا تريد عمل ترجمة لجدول users فتقوم بجعل كافة البيانات التي تحتمل ترجمة في جدول ثاني و تُسميه user_translations بحيث الجدول الأول يحتوي على البيانات التي لا تحتاج ترجمة و الجدول الثاني يحتوي على البيانات التي تحتاج ترجمة بحيث تربط الجدولين معاً بعلاقة 1 لأكثر يعني صف واحد من جدول users يكون له صف أو أكثر من جدول user_translations مثلا نريد ترجمة خانة إسمها name سيكون جدول user_translations يحتوي على الخانات التالية:

    • id
    • user_id
    • name
    • locale

    الخانة locale سنُخزن فيها لغة الصف فمثلا لو كنا نريد اللغتين العربية و الإنجليزية سيكون لكل صف من الجدول الأساسي صفين من الجدول الثاني صف يتم تخزين فيه الإسم باللغة العربية و تكون الخانة locale تحتوي على ar و صف يتم تخزين فيه الإسم باللغة الإنجليزية و تكون الخانة locale تحتوي على en

    بالتوفيق

    اهلا بيك عزيزي

    اعتقد ان الفكرة الاولى اسهل واوضح لدي بحيث يمكنني فقط عمل استعلامين او اعمل دالة الاتصال مرتين لو كانت للغة التطبيق عربية شغل لي ميثود الفولي التاليه ولو كانت انجليزية شغل لي ميثود الفولي التالية 

     

    واضحه الغالي كل الشكر لك بطبقها ولو فيه شي ما فهمته الي عوده لك عزيزي تسلم

    • أعجبني 1
  13. السلام عليكم ورحمة الله وبركاته

    تحيه طيبه للجميع

    لدي استفسار اعزائي

    انا عامل ترجمة لتطبيقي وهو يدعم اللغة العربية والانجليزية الافتراضية بطبيعة الحال . مشكلتي الان اني عامل مجموعة كلمات في قاعدة البيانات بحيث اني اعرض صوره + النص المرافق لها الذي سبق وتم تخزينه في قاعدة البيانات ولكن اذا كان تطبيقي يعمل بلغة العربية الان مثل المستخدم مختار العربية كيف ممكن نترجم هذا النصوص التي تأتي لنا من قاعدة البيانات الى للغة العربية .

    مع العلم اني احصل على البيانات من خلال الاتصال التالي :والحقل المطلوب ترجمته حول حقل name

        private void parseJSON() {
            String url = "https://===========.000webhostapp.com/ww.php";
            JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            progressDialog.dismiss();
                            try {
                                JSONArray jsonArray = response.getJSONArray("students");
    
                                for (int i = 0; i < jsonArray.length(); i++) {
                                    JSONObject hit = jsonArray.getJSONObject(i);
                                    JSONObject jsonObject=null;
                                    String creatorName = hit.getString("categoryID");
                                    String imageUrl = hit.getString("name");
                                    String movie_id = hit.getString("imageurl");
                                    mExampleList.add(new ListCatgery(creatorName,imageUrl,movie_id));
                                }
                                mExampleAdapter = new AdapterCatgeryMain(getContext().getApplicationContext(), mExampleList);
                                mRecyclerView.setAdapter(mExampleAdapter);
    
                            } catch (JSONException e) {
                                e.printStackTrace();
                           
                            }
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    error.printStackTrace();
                }
            });
    
            mRequestQueue.add(request);
        }

     

    أي فكرة لديكم اعزائي لذلك؟

     

  14. بتاريخ 1 ساعة قال Yomna Raouf:
    
    
    
    // build.gradle
    
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
      
    // MyGlideModule.kt
    
    @GlideModule
    class MyGlideModule : AppGlideModule()
      
    // MainActivity.kt
    
    override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
    
      val circularProgressDrawable = CircularProgressDrawable(this)
      circularProgressDrawable.strokeWidth = 5f
      circularProgressDrawable.centerRadius = 30f
      circularProgressDrawable.start()
    
      GlideApp.with(applicationContext)
          .load("https://raw.githubusercontent.com/bumptech/glide/master/static/glide_logo.png")
          .placeholder(circularProgressDrawable)
          .into(a_main_image)
    }

     

    يمكنك تنفيذ ذلك باستخدام CircularProgressDrawable

    شكرا لك عزيزي

  15. السلام عليكم ورحمة الله وبركاته

    تحيه طيبه للجميع

    لدي استفسار لو تكرمتو . انا عامل RecyclerView لتعرض مجموعة صور للمستخدم ولكن في بعض الاوقات بسبب اسباب مختلفة الصور تاخذ وقت حتى تظهر للمستخدم.

    ما اريد عمله الان في وقت تحميل هذا الصور للمستخدم في RecyclerView اريد ان يتم عرض مثل تاثير او شكل دائرة يدور في داخل الصورة حتى يعرف المستخدم بوجود عملية جاريه 

     

    مثال على ما احتاجه الصورة التاليه:

    device-2020-07-17.thumb.png.92d52636da52000027a28c5cf83277ab.png

     

    كيف يمكنني عمل ذلك؟

     

    مرفق لكم الكود الخاص فيني:

    MyAdapter

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
        List<List_Data>list_data;
        Context ct;
    
    
    
    
        public MyAdapter(List<List_Data> list_data, Context ct) {
            this.list_data = list_data;
            this.ct = ct;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.list_data,parent,false);
            return new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            final List_Data listData=list_data.get(position);
            Picasso.with(ct)
                    .load(listData.getImageurl())
                    .into(holder.img);
    
    
    
        }
    
    
    
        @Override
        public int getItemCount() {
            return list_data.size();
        }
    
        public class ViewHolder extends RecyclerView.ViewHolder{
            private ImageView img;
            public ViewHolder(View itemView) {
                super(itemView);
                img=(ImageView)itemView.findViewById(R.id.image_view);
            }
        }

    MainActivity

     private static final String HI = "https://uniqueandrocode.000webhostapp.com/hiren/androidtutorial/androidweb.php";
        private List<List_Data> list_data;
        private MyAdapter adapter;
        private RecyclerView rv;
        private JsonArrayRequest request;
        private RequestQueue requestQueue;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            rv=(RecyclerView)findViewById(R.id.recycler_view);
            rv.setHasFixedSize(true);
            rv.setLayoutManager(new LinearLayoutManager(this));
            list_data=new ArrayList<>();
    
    
            getImageData();
        }
    
        private void getImageData() {
            request=new JsonArrayRequest(HI, new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    JSONObject jsonObject=null;
                    for (int i=0; i<response.length(); i++){
                        try {
                            jsonObject=response.getJSONObject(i);
                            List_Data listData=new List_Data(jsonObject.getString("imageurl"));
                            list_data.add(listData);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                    setupData(list_data);
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
    
                }
            });
            requestQueue= Volley.newRequestQueue(this);
            requestQueue.add(request);
    
        }
    
        private void setupData(List<List_Data> list_data) {
            adapter=new MyAdapter(list_data,this);
            rv.setAdapter(adapter);
    
        }
    }
    

     

     

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
        </androidx.recyclerview.widget.RecyclerView>
    
    </RelativeLayout>

     

  16. بتاريخ 13 ساعات قال Mohamd Imran:

    السلام عليكم أخي ,أتوقع إنك تقوم بإستخدام ذلك في fragment لذلك يظهر لك الخطأ إن كنت تريد إستخدام الكود في fragment إستخدمه هكذا 

    
    getActivity().getResources();
    

    أو 

    
    getApplicationContext().getResources();

     

    هلا بيك عزيزي

    تسلم على ردك

    خلاص تم حل المشكله

    مودتي لك

    • أعجبني 1
  17. بتاريخ 2 دقائق مضت قال Yomna Raouf:
    
    public void setLocale(String lang) {
    
    myLocale = new Locale(lang);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);
    onConfigurationChanged(conf);
    /*Intent refresh = new Intent(this, AndroidLocalize.class);
    startActivity(refresh);*/
      }
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
      // refresh your views here
        lblLang.setText(R.string.langselection);
      super.onConfigurationChanged(newConfig);
    // Checks the active language
    if (newConfig.locale == Locale.ENGLISH) {
        Toast.makeText(this, "English", Toast.LENGTH_SHORT).show();
    } else if (newConfig.locale == Locale.FRENCH){
        Toast.makeText(this, "French", Toast.LENGTH_SHORT).show();
    }
      }

     declare in Manifest 

    
     android:configChanges="locale"

    ماذا عن هذا ؟؟

    ولكن الان لا يتم حفظ للغة التي تم اختيارها اختي ب هذا الطريقة

    سابقا هو يحفظ الكود الذي عملت مشاركه له ولكن هو يعمل تحديث للاكتفتي في كل لحظة فقط

  18. بتاريخ الآن قال Yomna Raouf:

      اعتقد أنه يجب عليك التحقق من activity  في ()onCreate اذا كان ال sharedPreference له القيمة  null أم لا 

    اذا كانت null ستكون الشاشة هي شاشة اختيار اللغة و ان لم تكن ستكون الشاشة homescreen او أيا كان ما تريده. 

    اهلا بيك 

    المشكلة هنا على حسب اعتقادي ولكن كيف يمكن استبداله 

     Intent refresh = new Intent(this, Arabic.class);
          startActivity(refresh);

    هو يعمل تحديث للاكتفي ويوصل ل sharedPreference ويرجع من دالة  ()onCreate لما يصير استدعاء ل ملف sharedPreference

  19. اهلا ي اخوان

    قمت بعمل كود لتمكين المستخدم من اختيار للغته المفضلة الكود شغال ولله الحمد وقمت باضافة له وهيا حفظ للغته المختاره حتى يتمكن بعد ايقاف التطبيق ورجوع له من جديد ان يستطيع اللغة التي اختارها والامر ناجح المشكلة الان الاكتفتي صاير يعمل تحديث باستمرار بدون توقف كل ما دخلت عليه ياليت اذا احد يعرف سبب المشكله يساعدنا بحلها

     

    الكود المستخدم:

     

    public class Arabic extends AppCompatActivity {
        Toolbar toolbar;
        SharedPreferences sharedPreferences;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.arabic);
            sharedPreferences=getSharedPreferences("mykedy",Context.MODE_PRIVATE);
            findViewById(R.id.BTN_ar).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    setLocale("ar");
                }
            });
            findViewById(R.id.BTN_en).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    setLocale("en");
                }
            });
    
            toolbar = findViewById(R.id.toolbar);
            toolbar.setTitle(getResources().getString(R.string.app_name));
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setHomeButtonEnabled(true);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    startActivity(new Intent(Arabic.this, MainActivity.class));
                    finish();
                }
            });
    
           //
    
            get();
        }
    
        @SuppressWarnings("deprecation")
        public void setLocale(String lang) {
    
            Locale myLocale = new Locale(lang);
            DisplayMetrics dm = getResources().getDisplayMetrics();
            Configuration conf = getResources().getConfiguration();
            conf.locale = myLocale;
            getResources().updateConfiguration(conf, dm);
           Intent refresh = new Intent(this, Arabic.class);
          startActivity(refresh);
            SharedPreferences share = getSharedPreferences("Data", Context.MODE_PRIVATE);
            SharedPreferences.Editor edit = share.edit();
            edit.putString("LOCALE",lang);
            edit.commit();
    
    
    
        }
        public void get( ) {
            SharedPreferences share = getSharedPreferences("Data", Context.MODE_PRIVATE);
           String lan = (share.getString("LOCALE",""));
           setLocale(lan);
    
        }
    
    }

     

  20. بتاريخ 1 دقيقة مضت قال Yomna Raouf:
    
    public void loadLocale() {
            String langPref = "Language";
            SharedPreferences prefs = getSharedPreferences("CommonPrefs",
                    Activity.MODE_PRIVATE);
            String language = prefs.getString(langPref, "");
            changeLang(language);
        }
    
    public void changeLang(String lang) {
            if (lang.equalsIgnoreCase(""))
                return;
            myLocale = new Locale(lang);
            saveLocale(lang);
            Locale.setDefault(myLocale);
            android.content.res.Configuration config = new android.content.res.Configuration();
            config.locale = myLocale;
            getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics());
    
        }
    
    public void saveLocale(String lang) {
            String langPref = "Language";
            SharedPreferences prefs = getSharedPreferences("CommonPrefs",
                    Activity.MODE_PRIVATE);
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString(langPref, lang);
            editor.commit();
        }

    و في ()onCreate

    
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_change_language);
            loadLocale();
        }

    أو:

    
    SharedPreferences sharedPref = getActivity().getPreferences(MY_PREFS_NAME,Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putString("lang", language);
    editor.commit();

    لتحصل على ال sharedprefrence:

    
    Context context = getActivity();
    SharedPreferences sharedPref = context.getSharedPreferences(
           MY_PREFS_NAME, Context.MODE_PRIVATE);
    String language = sharedPref.getString("lang", null); 

    يمكنك الاستعانة بالمرجع التالي:SharedPreferences reference

    او الدرس التالي:sharedPreference tutorial

    اهلا اختي

    شكرا على ردك

    الان انا قمت بعمل الحفظ لا توجد مشكلة ولكن المشكلة اصبح الاكتفتي يتحدث لدي بستمرار في كل ثانية بدون توقف 

  21. قمت بعمل اختيار للغة في التطبيق الاختيار شغال لا توجد مشكله ولكن المشكلة بعد اغلاق المستخدم للتطبيق توجد اللغة الى للغة الجهاز الافتراضية وليس ما تم اختياره 

    انا اريد حفظ اللغة المختارة ولما يفتح المستخدم التطبيق يستعيد او يكمل على اللغة التي اختارها سابق

     

    هذا كود الصفحة :

     

    
    public class Arabic extends AppCompatActivity {
        Toolbar toolbar;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.arabic);
    
            findViewById(R.id.BTN_ar).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
    
                    setLocale("ar");
                }
            });
            findViewById(R.id.BTN_en).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    setLocale("en");
                }
            });
    
            toolbar = findViewById(R.id.toolbar);
            toolbar.setTitle(getResources().getString(R.string.app_name));
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setHomeButtonEnabled(true);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    startActivity(new Intent(Arabic.this, MainActivity.class));
                    finish();
                }
            });
    
    
    
    
        }
    
        @SuppressWarnings("deprecation")
        public void setLocale(String lang) {
            Locale myLocale = new Locale(lang);
            DisplayMetrics dm = getResources().getDisplayMetrics();
            Configuration conf = getResources().getConfiguration();
            conf.locale = myLocale;
            getResources().updateConfiguration(conf, dm);
            Intent refresh = new Intent(this, Arabic.class);
            startActivity(refresh);
    
    
        }
    
    
    }

     

×
×
  • أضف...