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

Flutter Dev

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

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

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

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

    2

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

  1. بتاريخ 9 دقائق مضت قال عبود سمير:

    مرحباً

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

    بالتوفيق

    هل توجد مشكله بنسبه الى آمان البيانات حسب طريقتي ؟

  2. بتاريخ 10 دقائق مضت قال عبود سمير:

    لا يتم الحذف الآن لأن الإستعلام كان خاطئاً لكن الآن هو صحيح بقي جزء كود الفولي و يجب تغيير إقتران الحذف للشكل التالي 

    
    // إقتران الحذف  
    private void Deletefavaorit(String markte_id, String UserIdSessin) {
            String i_upd_url = "http://=========/end/delete.php"; // رابط ملف الحذف
            StringRequest strreq = new StringRequest(Request.Method.POST,i_upd_url,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String Response) {
                          Toast.makeText(getActivity(), Response , Toast.LENGTH_LONG).show();
                            Log.i(TAG, "ResponseTest"+Response.toString());
                        }
                    }, new Response.ErrorListener() {
                          @Override
                          public void onErrorResponse(VolleyError e) {
                              e.printStackTrace();
                    	  }
            		}){
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
    
                        Map<String,String> params = new HashMap<String,String>();
                        params.put("markte_id", markte_id);
                      	params.put("UserIdSessin", UserIdSessin);
                        return params;
                    }
            	};
            RequestQueue requestQueue = (RequestQueue) Volley.newRequestQueue(getActivity());
            requestQueue.add(strreq);
        }

    لا تنسى تضمين الكلاسات المستعملة و عند إستعمال الإقتران مرر له كل من markte_id و UserIdSessin على شكل string 
    جرب و أخبرني بالنتيجة 

    هلا فيك ي غالي 

    تم حل المشكله فعلا 

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

    ولكني اريد افهم شي منك لو تكرمت

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

  3. بتاريخ 17 دقائق مضت قال عبود سمير:

    مرحبا مروان 
    أظن أن المشكلة في الإستعلام الخاص بالحذف فهو يكتب بهذا الشكل: 

    
    <?php 
    
    $markte_id = $_POST["markte_id"];
    $UserIdSessin = $_POST["UserIdSessin"];
    
    $sql = "DELETE FROM favorite WHERE markte_id = '".$markte_id."' AND UserIdSessin = '".$UserIdSessin."'";

    تأكد من أن إسم الجدول هو favorite و يحتوي أيضا على الحقلين markte_id و UserIdSessin
    بالتوفيق

    لم ينجح الامر عزيز

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

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

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

    حقيقي المشكله غريبه لم اجد لها تفسير او حل رغم كل المحاولات 

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

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

    عذرا على الازعاج ولكن لدي استفسار..

    استخدم مكتبة Volley + php file + mysql في تطبيقي للقيام بعملية الاتصال وتخزين البيانات وتعديل عليها وحذفها الخ..

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

     <?php
     
    	$servername = "localhost";
    	$username = "root";
    	$password = "";
    	$dbname = "test";
    
    	$conn = mysqli_connect($servername, $username, $password, $dbname);
    	if ($conn) {
    $markte_id = $_POST["markte_id"];
    	$UserIdSessin = $_POST["UserIdSessin"];
    
    		$sql = "DELETE from favorite where markte_id = markte_id and UserIdSessin =UserIdSessin";
    
    		
    		if(mysqli_query($conn, $sql))
    		{
    		
    			echo json_encode(array('response' => 'DELETE OK'));
    		} else {
    			echo json_encode(array('response' => 'DELETE NO'));
    		}
    		
    	} else {
    		echo json_encode(array('response' => 'Connection Error'));
    	}
    	
    	mysqli_close($conn);
    ?> 

    والاتصال اليه بواسطة الكود  التالي :

        private void Deletefavaorit() {
            String i_upd_url = "http://=========/end/dr.php?markte_id=" + markte_id + "&UserIdSessin=" + UserIdSessin;
            StringRequest strreq = new StringRequest(Request.Method.POST,i_upd_url
                    ,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String Response) {
                          Toast.makeText(getActivity(), Response , Toast.LENGTH_LONG).show();
                            Log.i(TAG, "ResponseTest"+Response.toString());
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError e) {
                    e.printStackTrace();
                }
            });
            RequestQueue requestQueue = (RequestQueue) Volley.newRequestQueue(getActivity());
            requestQueue.add(strreq);
        }
    
    
    }

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

    ورد السيرفر يكون كالتالي :

     

        <font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
        <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Notice: Undefined index: markte_id in C:\wamp64\www\end\dr.php on line <i>10</i></th></tr>
        <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
        <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
        <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0002</td><td bgcolor='#eeeeec' align='right'>401384</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='C:\wamp64\www\end\dr.php' bgcolor='#eeeeec'>...\dr.php<b>:</b>0</td></tr>
        </table></font>
        <br />
        <font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
        <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Notice: Undefined index: UserIdSessin in C:\wamp64\www\end\dr.php on line <i>11</i></th></tr>
        <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
        <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
        <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0002</td><td bgcolor='#eeeeec' align='right'>401384</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='C:\wamp64\www\end\dr.php' bgcolor='#eeeeec'>...\dr.php<b>:</b>0</td></tr>
        </table></font>
        {"response":"DELETE OK"} 

     

    طبعا انا الي فهمته بوجود مشكلة في :

    Notice: Undefined index: markte_id
    Notice: Undefined index: UserIdSessin

    ولكني متاكد من تمرير البيانات من خلال url لمكتبة volley 

    وقد قمت بتجربة ذلك كالتالي قمت بمشاهدة البيانات التي يتم ارسالها من خلال الرابط  :

              String i_upd_url = "http://======/end/dr.php?markte_id=" + markte_id + "&UserIdSessin=" + UserIdSessin;
    
    Log.i(TAG, "ResponseTest"+i_upd_url.toString());

    وكانت النتيجة كالتالي:

    : ResponseTesthttp://=======/end/dr.php?markte_id=83&UserIdSessin=31

    مع العلم 

    markte_id = 83

    UserIdSeein =31 

    جميع البيانات صحيحه التي تم ارسالها في الرابط 

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

    favoriteID

    markte_id

    UserIdSessin

     

    لا اعلم اين  المشكلة ياليت اذا احدكم معه فكره عن سبب المشكلة يفيدنا بسببها ولكم جزيل الشكر 

  5. بتاريخ 1 ساعة قال محمد ربيع زليول:

    في السطر الأول، تحاول مقارنة UserIdSessin مع UserIdSessin ومقارنة markte_id مع markte_id، هي نفس القيم، وإن قمت بمقارنتها ستكون المقارنة دئمًا صحيحة.

    ما قصدته هو التالي:

    أنت الآن تحضر مجموعة من البيانات من جانب الخادم، أفترض أن هذه البيانات هي متاجر، مثلًا وتقوم بإحضارها من قاعدة البيانات بالشكل التالي:

    
    select * from markets

    إما أن تقوم بتغير الإستعلام ليصبح بالشكل التالي:

    
    SELECT markets.*, (SELECT COUNT(*) FROM table_name WHERE table_name.markte_id = markets.id and table_name.UserIdSessin = x) AS liked FROM markets

    طبعًا مع تعويض:

    •  table_name بإسم جدول الإعجابات
    • markets بإسم جدول المتاجر
    • id بإسم حقل id لجدول المتاجر
    • x برقم المستخدم.

    الآن أنت تملك حقل إضافيًا إسمه liked سيحتوي على قيمة 1 إذا كان المستخدم معجبًا بالمتجر و0 إذا كان غير معجب به.

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

    شكرا لك عزيزي 

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

  6. بتاريخ 1 ساعة قال محمد ربيع زليول:

    دائمًا في البرمجة هناك حلول مختلفة لعمل نفس الشيء، سأذكر لك حلًا من الحلول الممكنة، عندما تأتي بمعلومات المتاجر، قم بجلب معلومة إضافية وهي هل قام هذا المستخدم بعمل إعجاب أو لا، طبعًا ستقوم بهذا في جزء الخادم حسب اللغة البرمجية التي تشتغل بها.

    المهم عند عرضك للمتاجر ستقوم بعمل شرط إذا كان المستخدم معجب بالمتجر ضع مثلًا قلبًا أحمر، وإن لم يكن المستخدم معجبًا بالمتجر قلب رمادي.

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

    بامانه لم افهم جيد عليك ولكني حاولت ان اقوم بتالي ولم ينجح الامر

          if (UserIdSessin.equals(UserIdSessin) && (markte_id.equals(markte_id))){
    
                                button10.setEnabled(true);
                                button10.setBackgroundResource(R.drawable.ic_favorite);
                            }else {
                                button10.setEnabled(false);
                                button10.setBackgroundResource(R.drawable.ic_favorite_black_24dp);
                            }

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

  7. @محمد ربيع زليول

    كل الشكر لك ي غالي الكود شغال تم حل المشكلة عدم ازدواجية تكرار الاعجاب من نفس اليوزر

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

    كيف يمكن عمل ذلك الان عزيزي ؟ اين يجب ان اضع الشرط وكيف تكون صيغة الشرط ؟  

     

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

    طبعًا، كل الإمكانيات ممكنة.

    لكن، لو أراد المستخدم إلغاء الإعجاب، كيف سيقوم بذلك في هذه الحالة؟

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

    سوف اقوم بتطبيق الطريقه التي اعطيتني ايها عزيزي وساقوم بافادتك ب النتيجه باذن الله

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

    قم بإضافة خانة لعدد الإعجابات لكل متجر في البداية ستكون الخانة تحتوي على 0 إعجاب، عند إضافة إعجاب قم بإدخاله لجدول الإعجابات وفي نفس الوقت إذهب لجدول المتاجر وأضف إعجاب لخانة الإعجابات للمتجر لتصبح الإعجابات 1، وعند حذف إعجاب إجعلها 0 وهكذا

    لجعل المستخدم يعجب بالمتجر مرة واحدة قم بالخطوات التالية:

    عند ضغط المستخدم في التطبيق على زر الإعجاب.

    قم بإرسال طلب لنظام الخادم backend برقم المستخدم و رقم market كما تقوم به الآن

    في جانب الخادم، قم أولًا بالتحقق من أن المستخدم سبق أو لم يسبق له الإعجاب بذلك market، عن طريق عمل where ب UserIdSessin و market_id.

    
    select * from table where markte_id = x and UserIdSessin = y

    إذا كان المستخدم سبق له الإعجاب بالمتجر قم بحذف هذا الإعجاب عن طريق خذفه من قاعدة البيانات.

    
    DELETE from table where markte_id = x and UserIdSessin = y

    أما إن كان المستخدم لم يسبق له الإعجاب قم بعمل إضافة لهذا السطر في قاعدة البيانات.

    
    INSERT INTO table (markte_id, UserIdSessin) VALUES (x, y);

    ملحوظة: قم بتعويض table بإسم الجدول وx وy برقم المتجر والمستخدم.

    هلا بيك عزيزي

    لماذا نقوم ب حذف الاعجاب اخوي؟

    الا يكفي التحقق من وجوده مسبقا ثم تعطيل الزر على المستخدم؟

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

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

    لدي جدول لجمع اعجابات المستخدمون على الشكل التالي :

    159247465560371.png

     

    انا أقوم بعملية جمع اعداد الارقام في الحقل counts من خلال select count  في ملف الاتصال php لكل موضوع بشكل مستقل لني واضع جمله الشرطيه where markte_id = market_id 

     

    مع العلم ان حقل useridsessin هذا id الخاص ب اليوزر حتى اعلم ان اليوزر رقم 5 قام بوضع اعجاب للموضوع رقم 99 مثلا 

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

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

    كيف يمكنني التحقق من ذلك أي فكره لعمل ذلك يمكن استخدامها ؟

     

    هذا كود volley المستخدم 

        private void Likes() {
            String HI ="http://=========/Like.php?markte_id=" + markte_id;
            StringRequest stringRequest=new StringRequest(Request.Method.GET, HI, new Response.Listener<String>() {
            
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject jsonObject=new JSONObject(response);
                        JSONArray array=jsonObject.getJSONArray("data");
    
                        for (int i=0; i<array.length(); i++ ){
                            JSONObject ob=array.getJSONObject(i);
                      
                     
                            String count= ob.getString("count"); 
                            text_total_likes.setText(count);
                      
                           /*
                            if (count.equals("0")){
    
                                button10.setEnabled(true);
                                button10.setBackgroundResource(R.drawable.ic_favorite);
                            }else {
                                button10.setEnabled(false);
                                button10.setBackgroundResource(R.drawable.ic_favorite_black_24dp);
                            }
                            
                            */
                         
    
                        }
                   
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
    
              
    
    
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
    
                }
            });
            RequestQueue requestQueue= Volley.newRequestQueue(getContext());
            requestQueue.add(stringRequest);
        }

     

  11. بتاريخ On 17‏/6‏/2020 at 09:38 قال Mohamd Imran:

    وعليكم السلام أخي @مروان مروان3

    الأمر سهل :) ,يمكنك عمل ذلك من خلال إضافة Ratingbar فيو في الlayout الذي تريد هكذا

    
    <RatingBar
    android:id="@+id/RatingBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

    وقم بإعطاءه id معين ,والأن نقوم بالإشارة إليه(تفعيله initiate) في ال onCreate ميثود بعد setContentview  بهذه الطريقة

    
    RatingBar simpleRatingBar = (RatingBar) findViewById(R.id.RatingBar); 

    ونقوم بإرجاع عدد النجمات المختارة من قبل المستخدم من خلال الميثود getNumStars(); ستقوم بإرجاع عدد النجمات المختارة هكذا

    
    int Starscount = simpleRatingBar.getNumStars(); 

    بعد ذلك يمكنك حفظ القيمة في قاعدة البيانات القيمة تخزن في المتغير Starscount ,وبخصوص الحفظ والإسترجاع من قاعدة البيانات هل تريد مثال لقاعدة بيانات محلية ؟أم بإستخدام api أي حفظ عن بعد 

    هلا بيك عزيزي @Mohamd Imran

    شاكر لك ي غالي كثير والسموحة والعذر لني تعبتك معي كثير  

    ربي يرزقك جنات النعيم يا رب 

    • أعجبني 1
  12. بتاريخ 1 ساعة قال Mohamd Imran:

    وعليكم السلام أخي @مروان مروان3

    الأمر سهل :) ,يمكنك عمل ذلك من خلال إضافة Ratingbar فيو في الlayout الذي تريد هكذا

    
    <RatingBar
    android:id="@+id/RatingBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

    وقم بإعطاءه id معين ,والأن نقوم بالإشارة إليه(تفعيله initiate) في ال onCreate ميثود بعد setContentview  بهذه الطريقة

    
    RatingBar simpleRatingBar = (RatingBar) findViewById(R.id.RatingBar); 

    ونقوم بإرجاع عدد النجمات المختارة من قبل المستخدم من خلال الميثود getNumStars(); ستقوم بإرجاع عدد النجمات المختارة هكذا

    
    int Starscount = simpleRatingBar.getNumStars(); 

    بعد ذلك يمكنك حفظ القيمة في قاعدة البيانات القيمة تخزن في المتغير Starscount ,وبخصوص الحفظ والإسترجاع من قاعدة البيانات هل تريد مثال لقاعدة بيانات محلية ؟أم بإستخدام api أي حفظ عن بعد 

    هلا بيك عزيزي

    @Mohamd Imran

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

    بنسبه ل نوع قاعدة البيانات

    mysql

    واستخدم Volley connection + php file

    علي سيرفر محلي wmap

    ياليت لو عندك مثال كيف اربطه باستخدام مكتبة Volley وكيف استعيد العدد او التقيم

    وعذرا على الازعاج

    بتاريخ منذ ساعة مضت قال عبود سمير:

    مرحباً مروان 

    تطبيق الأندرويد الخاص بك لا يستطيع التواصل مباشرة مع قاعدة البيانات MySQL وإنما يتم بناء واجهة برمجية API حيث أن التطبيق سيقوم بإرسال طلب ( request ) لهذه الواجهة و ترجع له رد ( response ) و يتم بناء هذه الواجهة بإستعمال إحدى لغات البرمجة التي تعمل في جانب الخادم 

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

    مثلاً إذا نجح المستخدم في تسجيل دخوله للتطبيق يصبح بإمكانه عمل تقييم لمنتج و في هذه الحالة أيضا سيتم إرسال طلب او request للواجهة البرمجية و ستتم معالجة الطلب و حفظ البيانات في قاعدة البيانات و إرجاع رد للتطبيق 

    ملاحظة: عملية التقييم لا تحتاج فقط إلى تسجيل الدخول بل إلى شرط إضافي و هو شراء المستخدم للمنتج الذي يريد أن يُقيِّمه

    هذه هي الفكرة بشكل عام و تتضمن نقطتين و هما :

    1. بناء الواجهة البرمجية و عمل حماية لها 
    2. ربط التطبيق مع الواجهة البرمجية 

    يتوجب عليك تجربة الواجهة البرمجية قبل ربط التطبيق معها 

    بالتوفيق 

    هلا بيك اخوي

    شكرا على توضيح الفكره عزيزي

    بنسبه للي ذكرته انته في الاعلى

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

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

     

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

     

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

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

    استفسار ي اخوان لو تكرمتو

    كيف يمكن عمل نظام تقييم المنتج

    مثلا لدي تطبيق يعرض منتجات وارغب بجعل المستخدمين قادرين على تقييم المنتجات

    نجمه نجمتين ثلاث وما شابه

    وارغب بحفظ التقيم في قاعدة بيانات mysql واستعادتها 

    بحيث تكون محفوظه من الفقد

    حاولت ابحث عن مثال ولكن لم اجد

     

    مثل هذا

    159236977328171.png

     

    • أعجبني 1
  14. هلا بيك عزيزي

    بتاريخ 15 ساعات قال Mohamd Imran:

    السلام عليكم أخي @مروان مروان3

    حسب ما فهمت إنك تريد تكبير حجم الصورة بعد ضغط المستخدم عليها  ,إن كان كذلك ,يمكنك القيام بذلك من خلال إعطاء id لل imageview مثال 

    
    <ImageView
        android:id="@+id/image_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/picture" 
        android:clickable="true" />

    ثم إستخدام setonclicklistener على ال image view  وداخل onClick نقوم بتغيير الحجم من خلال LayoutParams هكذا 

    
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(newWidth, newHeight);
    imageView.setLayoutParams(params);

    مع تغيير قيم newWidth , newHeight بالحجم الذي تريده 

    بخصوص هذا الحركه للفائده فقط 

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

    com.github.chrisbanes.photoview.PhotoView

     

    • أعجبني 1
  15. بتاريخ 12 ساعات قال Mohamd Imran:

    السلام عليكم أخي @مروان مروان3

    الجزء المسؤول على إضافة البيانات هو المصفوفة SPINNER_DATA2 في الكود الخاص بك  ,تأكد منها إن كانت تحوي بيانات يمكنك عمل المصفوفة وإضافة البيانات لها مثل 

    
    ArrayList<String> arrayList = new ArrayList<>();
    arrayList.add("text");
    arrayList.add("text1");
    arrayList.add("text2");
    arrayList.add("text3");
    arrayList.add("text4");
    arrayList.add("text5");
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, arrayList);

    لاحظ هنا في ال arrayAdapter نقوم بتمرير المصفوفة هنا إسمها arrayList

    
    new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, arrayList);

     وبخصوص الخطأ الذي يظهر لك معناه أن ال textview فارغ null   

    
    android.widget.TextView.setText

    تأكد من أنك قمت بتعريفه في ال onCreate ميثود 

    هلا فيك عزيزي

    فعلا انا ما انتبهت اني قد وضعت getIntent 

    اعلى من تعريف spinner شكرا لك ي غالي وعذرا على الخطاء

    • أعجبني 1
  16. بتاريخ 23 دقائق مضت قال Mohamd Imran:

    السلام عليكم أخي @مروان مروان3

    الجزء المسؤول على إضافة البيانات هو المصفوفة SPINNER_DATA2 في الكود الخاص بك  ,تأكد منها إن كانت تحوي بيانات يمكنك عمل المصفوفة وإضافة البيانات لها مثل 

    
    ArrayList<String> arrayList = new ArrayList<>();
    arrayList.add("text");
    arrayList.add("text1");
    arrayList.add("text2");
    arrayList.add("text3");
    arrayList.add("text4");
    arrayList.add("text5");
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, arrayList);

    لاحظ هنا في ال arrayAdapter نقوم بتمرير المصفوفة هنا إسمها arrayList

    
    new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, arrayList);

     وبخصوص الخطأ الذي يظهر لك معناه أن ال textview فارغ null   

    
    android.widget.TextView.setText

    تأكد من أنك قمت بتعريفه في ال onCreate ميثود 

    هلا بيك عزيزي

    لا اخي المشكلة ليست بتعبئة المصفوفه 

    الان انا استقبل البيانات من صفحة ثانية وارغب بتعبئتها مثل المثال التالي:

    Intent i = getActivity().getIntent();
    final String name= i.getStringExtra("name");
    
    textname.setText(name);

    مع فرق الاداة المثال يحتوي على اداة edit text 

    وما احتاجه هو MaterialBetterSpinner 

     

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

    لدي استفسار لو تكرمتو ..

    انا استخدم imageview لعرض الصور في تطبيقي 

    اقوم بتعئة image view من خلال بيانات قمت بنقلها عن طريق Intent 

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

     

    مثال لتوضيح الاستفسار 

    الان انا استطيع ان اعرض الصورة كالتالي:

    159195419427521.jpeg

     

     

     

    وما اريده كالتالي بعد ضغط المستخدم

     

    159195419430572.jpeg

    كيف ممكن نعمل هذا الحركه؟

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

    استخدم في تطبيقي نقل البيانات بين صفحات التطبيق 

    انا اعرف استقبل البيانات واعرضهم في edit text مثلا

    كالتالي :

    Intent i = getActivity().getIntent();
    final String name= i.getStringExtra("name");
    
    textname.setText(name);

    ولكن لدي مشكلة انا استخدم MaterialBetterSpinner وارغب ان اقوم بتعبته من البيانات التي استقبلها مثل ما فعلت مع edit text  جربت ان يكون الكود بشكل التالي ولكن كان ذلك خطاء :

    materialBetterSpinner.setText(name);

    وهذا رسالة الخطاء التي احصل عليها:

     

     Process: com.example.myapplication, PID: 25343
        java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
            at com.example.myapplication.Fragmant.ViewOrders.onCreateView(ViewOrders.java:113)
            at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
            at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
            at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
            at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
            at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
            at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
            at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
            at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2169)
            at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1992)
            at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
            at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1818)
            at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:303)
            at androidx.fragment.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:246)
            at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
            at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
            at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
            at android.view.View.measure(View.java:21051)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
            at android.view.View.measure(View.java:21051)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
            at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
            at android.view.View.measure(View.java:21051)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
            at android.view.View.measure(View.java:21051)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
            at android.view.View.measure(View.java:21051)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
            at android.view.View.measure(View.java:21051)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6459)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
            at com.android.internal.policy.DecorView.onMeasure(DecorView.java:853)
            at android.view.View.measure(View.java:21051)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2583)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1642)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1893)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1522)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7098)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:927)
            at android.view.Choreographer.doCallbacks(Choreographer.java:702)
            at android.view.Choreographer.doFrame(Choreographer.java:638)
    2020-06-12 02:49:33.597 25343-25343/com.example.myapplication E/AndroidRuntime:     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:913)
            at android.os.Handler.handleCallback(Handler.java:751)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:154)
            at android.app.ActivityThread.main(ActivityThread.java:6682)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

     

    وهذا كوده كامل :

     materialBetterSpinner2 = (MaterialBetterSpinner) findViewById(R.id.material_spinner2);
            ArrayAdapter<String> adaptermat = new ArrayAdapter<String>(AddNewTopic.this, android.R.layout.simple_dropdown_item_1line, SPINNER_DATA2);
            materialBetterSpinner2.setAdapter(adaptermat);

    كيف يمكن تعبئته بالبيانات التي تم نقلها الى الاكتفتي؟

    • أعجبني 1
  19. مرحبا جميعا يا اخوان

    استخدم tabLayout لعرض مجموعة جداول في مشروعي 

    اريد اقوم بعمل اخفاء لجدول محدد من اصل 3 جداول 

    ولكن كل ما حاولت اعمل اخفاء له تظهر لي الرسالة التالية

    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setVisibility(int)' on a null object reference
            at com.example.myapplication.Fragmantmarket.MainActivityFargmain.TableInVisable(MainActivityFargmain.java:137)
            at com.example.myapplication.Fragmantmarket.AboutUser.onCreateView(AboutUser.java:69)
            at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
            at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
            at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
            at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
            at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
            at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
            at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
            at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2169)
            at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1992)
            at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
            at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1818)
            at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:303)
            at androidx.fragment.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:246)
            at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
            at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
            at androidx.viewpager.widget.ViewPager$3.run(ViewPager.java:273)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:927)
            at android.view.Choreographer.doCallbacks(Choreographer.java:702)
            at android.view.Choreographer.doFrame(Choreographer.java:635)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:913)
            at android.os.Handler.handleCallback(Handler.java:751)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:154)
            at android.app.ActivityThread.main(ActivityThread.java:6682)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

     

     

     

    وهذا الكود كامل 

     

    public class MainActivityFargmain extends AppCompatActivity {
    
        Toolbar toolbar;
        TabLayout tabLayout;
        ViewPager viewPager;
        AdapterTableViewOrder adapterTableViewOrder;
        TabItem tabChats;
        TabItem tabStatus;
         TabItem tabCalls;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.m_fragmant_view);
    
            toolbar = findViewById(R.id.toolbar);
            toolbar.setTitle(getResources().getString(R.string.app_name));
            setSupportActionBar(toolbar);
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setHomeButtonEnabled(true);
    
            tabLayout = findViewById(R.id.tablayout);
            tabChats = findViewById(R.id.tabChats);
            tabStatus = findViewById(R.id.tabStatus);
            tabCalls = findViewById(R.id.tabCalls);// الجدول الذي احاول اعمل اخفاء له
            viewPager = findViewById(R.id.viewPager);
      
           
           tabCalls.setVisibility(View.INVISIBLE);// ما احاول القيام به 
          
          
     adapterTableViewOrder = new AdapterTableViewOrder(getSupportFragmentManager(), tabLayout.getTabCount());
           viewPager.setAdapter(adapterTableViewOrder);
    
            tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    viewPager.setCurrentItem(tab.getPosition());
    
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
    
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
            viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    
        }
    
    
    }

    لا اعلم ما هو السبب ما فيه خطاء في كتابة صياغة الكود

    بنسبة لتصميم XML كالتالي :

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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"
      android:orientation="vertical"
     >
    
      <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:theme="@style/ThemeOverlay.AppCompat.Dark" />
    
      <com.google.android.material.tabs.TabLayout
        android:id="@+id/tablayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        app:tabSelectedTextColor="@android:color/white"
        app:tabTextColor="@android:color/black">
    
        <com.google.android.material.tabs.TabItem
            android:id="@+id/tabChats"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TABLE1" />
    
        <com.google.android.material.tabs.TabItem
            android:id="@+id/tabStatus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TABLE2" />
    
        <com.google.android.material.tabs.TabItem
            android:id="@+id/tabCalls"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TABLE3"
            />
    
      </com.google.android.material.tabs.TabLayout>
    
      <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    </LinearLayout>

     

    حاولت ايضا استخدام في ملف xml 

       <com.google.android.material.tabs.TabItem
            android:id="@+id/tabCalls"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="About sender"
            android:visibility="gone"
            />

    ولكن ايضا لم ينجح الامر 

    انا احتاج ان اعمل الامر برمجي في الصفحة المرفقة في اعلى 

     

    ياليت اذا فيه احد يعرف سبب المشكله يعلمنا 

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

    هناك أشياء يجب معرفتها أولًا، مهما كانت قدرة هذا المحول على تحويل تطبيقات Android إلى IOS يجب الإنتباه لإختلافات جوهرية بين النظامين ومن بينها:

    1. إختلاف بين تجربة التنقل في نظام Android و iOS. مثلًا تعتمد هواتف Android على 3 أزرار للتنقل ،("المنزل" و "الخلف" و "تعدد المهام"). أما iPhone بها زر "رئيسي" واحد فقط.
    2. إختلاف واجهات المستخدم (UI) لنظامي التشغيل Android و iOS. حيث يستخدم Android الـ 'Material design'، أما iOS فيعتمد على "Flat design".
    3. عليك أن تضع في اعتبارك قدرة هذا المحول ودعمه لجميع الإصدارات.
    4. إختلاف المكتبات وأطر عمل في هذين النظامين وبالتالي سنحتاج إلى أدوات ومكتبات متوافقة مع النظامين.
    5. تطبيقات IOS يجب عليها إحترام إرشادات مراجعة متجر التطبيقات، وهذه الإجراءات غير مطبقة في متجر جوجل بلاي.

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

    المهم: من خلال بحثي في الإنترنت وجدت التالي:

    • كان هنالك موقع لشركة ناشئة تدعى MechDome تتيح أداة لتحويل apk لل IOS لكن الموقع توقف حاليًا، على حسب المقالات أن الأداة تدعم تحويل تطبيقات تعتمد فقط المكتبات الرئيسية لجافا، لكني وجدت موقع الشركة خارج الخدمة فلم يتسنى لي التحقق من الخدمة.
    • كما أنني وجدت أداة J2ObjC من جوجل لتحويل كود جافا إلى كود Objective C، لكنها طبعا لا تدعم الواجهات UI، يمكنك الإطلاع عليها من هنا: مكتبة J2ObjC.

    اذن تتبقى لك الحلول التالية:

    • إنشاء تطبيق جديد بإستخدام لغة سويفت، ونقل نفس المميزات الموجودة على تطبيق الأندرويد إلى التطبيق الجديد، وطبعًا سيمكنك هذا من الحصول على تطبيق بأداء عالي، بتجربة مشابهة للتطبيقات الأصيلة المعدة بالسويفت، يمكنك الإعتماد على كود Android للإلهام فقط.
    • أو يمكنك أن تقوم بعمل التطبيق الجديد عن طريق flutter أو react native، وبهذا التطبيق الجديد سيعمل على المنصتين بأداء جيد.

    اهلا بيك اخي 

    حقيقي ان تجربتي مع برمجة ios app ضعيفه جدا مقارنه مع الجافا في اندرويد والمشكله الاكبر اني قد برمجة تطبيق وقريب انتهي ولم احسب لهذا النطقه حساب الا بعد فوات الأوان.

     

    ولكن للمستقبل باذن الله هل تنصحني بتجربة  flutter او الزامرن ؟ ولماذا؟ وايهم الاسهل ؟ وايهم الاكثر دعم ويسهل الحصول على كوداته من خلال النت ؟

     

    مع العلم اني لم اعمل عليهم من قبل ولكن الزامن تعتمد على سي شارب حسب ما فهمت وسي شارب مشابهة ل vb.net ولي تجربة سابقه مع vb 

    • أعجبني 1
  21. بتاريخ On 8‏/6‏/2020 at 10:29 قال Mohamd Imran:

    أهلا بك أخي @مروان مروان3

    بالطبع يمكنك ذلك من خلال عمل ميثود للإخفاء وميثود للإظهار وإستدعاء مثلاً الميثود الخاص بالإخفاء في الزر الثاني والثالث وقمت بعمل الميثودز لك 

    
    public  void showTabLayout() {
                    parentTabs.setVisibility(View.VISIBLE);
                }
    
        public  void hideTabLayout() {
                    parentTabs.setVisibility(View.GONE);
    
                }

    ويمكنك إستدعاء الميثود التي تريد مثلا لإظهار tablayout  نستدعي الميثود showTabLayout والعكس :) 

    شكرا عزيزي

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

    وبعدها قمت بطلبه من الاكتفتي المستهدف

    ايضا قمت بوضع عند تفعيل الاكتفتي الاساسي الوضع دائما (ظهور) visable

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

    استفسار لو تكرمتو ..

    اذا كنت مبرمج تطبيق اندرويد بلغة الجافا واحتاج الى طريقة لتشغيله على IOS

    هل يمكن تحويل التطبيق كامل وصنع نسخة ثانية منه ؟

    ام توجد طريقة لتحويل الاكواد ؟

    او فيه حل مختلف 

    • أعجبني 1
  23. بتاريخ منذ ساعة مضت قال Mohamd Imran:

    مرحبا بك أخي ,لم تحدث المشكلة في السورس كود السابق ,حاليا أقوم بتفحص السورس الكامل 

    @Mohamd Imran

    هلا بيك ي غالي

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

    المشكلة ليست في الازار 

    المشكلة في الجدول كيف لا اعلم 

    ولكن لو كان لدينا جدولين وكان الثاني يعمل السلايد شو فيه 

    الاول لن يعمل ولكن لو قمت باضافة جدول ثالث فارغ فل يكن 

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

    فسيعود للعمل 

    لا اعلم ما هو السبب بصراحه وقد بحثت وحاولت كثير ولكن بدون فائده والكود لا يوجد به اي خطاء لو كان يوجد لن يعمل ابدا

     

    هذا فيديو قمت بتصويره من جهازي يظهر المشكلة وكيف يحدث ما اخبرتك به الان 

     

    https://up4net.com/uploads/up4net-20200609-072729-240x426.mp4

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

     

    MyApplication4_3.rar

×
×
  • أضف...