-
المساهمات
6975 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
218
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Wael Aljamal
-
يجب وضع WebView داخل SwipeRefreshLayout. جافا: import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; public class SwipeDownRefresh extends AppCompatActivity { WebView webView; SwipeRefreshLayout swipe; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_swipe_down_refresh); swipe = (SwipeRefreshLayout) findViewById(R.id.swipeContainer); swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { LoadWeb(); } }); LoadWeb(); } public void LoadWeb(){ webView = (WebView) findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setAppCacheEnabled(true); webView.loadUrl("https://www.google.com/"); swipe.setRefreshing(true); webView.setWebViewClient(new WebViewClient() { public void onPageFinished(WebView view, String url){ swipe.setRefreshing(false); } }); } @Override public void onBackPressed(){ if (webView.canGoBack()){ webView.goBack(); }else { finish(); } } } XML: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" > <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeContainer" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/webView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" /> </android.support.v4.widget.NestedScrollView> </android.support.v4.widget.SwipeRefreshLayout> </RelativeLayout> يمكنك التحديث أيضا من خلال: Webview.Reload(); مثال آخر: XML: <?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" android:orientation="vertical" tools:context="net.softglobe.tutorials.WebViewActivity"> <ProgressBar android:id="@+id/pb" android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:visibility="gone"/> <android.support.v4.widget.SwipeRefreshLayout android:layout_below="@+id/pb" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swiperefresh" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout> </RelativeLayout> #################33 java: package net.softglobe.tutorials; import android.graphics.Bitmap; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; public class WebViewActivity extends AppCompatActivity { private WebView mWebView; private ProgressBar mProgressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); mWebView = (WebView) findViewById(R.id.webview); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.loadUrl("https://www.google.com"); //SwipeRefreshLayout final SwipeRefreshLayout finalMySwipeRefreshLayout1; finalMySwipeRefreshLayout1 = findViewById(R.id.swiperefresh); finalMySwipeRefreshLayout1.setOnRefreshListener( new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { // This method performs the actual data-refresh operation. // The method calls setRefreshing(false) when it's finished. mWebView.loadUrl(mWebView.getUrl()); } }); // Get the widgets reference from XML layout mProgressBar = findViewById(R.id.pb); mWebView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { // Visible the progressbar mProgressBar.setVisibility(View.VISIBLE); } @Override public void onPageFinished(WebView view, String url) { finalMySwipeRefreshLayout1.setRefreshing(false); mProgressBar.setVisibility(View.GONE); } }); mWebView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int newProgress){ // Update the progress bar with page loading progress mProgressBar.setProgress(newProgress); if(newProgress == 100){ // Hide the progressbar mProgressBar.setVisibility(View.GONE); } } }); } }
-
الدالة التي تستخدم await يجب أن تكون async، هل يمكنك محاولة وضع async في السطر 8 قبل تعريف anonymos function؟
- 5 اجابة
-
- 2
-
-
بعد تهيئة المستودع المحلي و دليل الفهرسة للملفات و المجلدات باستخدام git init علينا تحديد ما هي الملفات التي نريد إضافتها ليتم تتبع تغييراتها و لكي تكون جزءا من مستودع المشروع لذلك نستخدم git add لإضافة مجلدات/ملفات. # إضافة ملف واحد git add <file> # إضافة جميع ملفات و مجلدات المشروع الموجودة في المجلد الرئيسي له git add . لتثبيت التعديلات التي قمنا بها بالملفات المضافة للمستودع المحلي نستخدم التعليمة التالية مع كتابة رسالة توضيحية لما قمنا به من تعديلات قبل تثبيت التغييرات: git commit -m "إنشاء نمذج المستخدم" أما التعليمة: git commit -a تقوم بعمل جميع ما سبق، تتبع تعديلات الملفات المضافة للدليل المحلي و تثبيت التعديلات بشكل أوتوماتيكي.
-
في المجلد الرئيسي للمشروع نضيف ملف باسم: .gitignore ونضع بداخله أسماء المجلدات المحلية و الملفات التي لا نريد رفعها مع المشروع: node_modules/ بنفس الطريقة نضيف أي مجلد أو ملفات.
- 2 اجابة
-
- 1
-
-
Origin هي اختصار لرابط المستودع البعيد URL، حيث بعد ربط المستودع المحلي مع الرابط الخاص بالمستودع البعيد ليس علينا أن نتذكر ما هو الرابط و أن نعيد كتابته مرارا و تكررا في كل عملية دفع بيانات أو في أي حالة ولا داع لها. مثلا لو كان رابط المتودع هكذا، ستكون قيمة origin هي نفسه: https://user@github.com/user/hello_world.git => origin ثم يمكن استخدامها لدفع الملفات للمستودع البعيد /ويمكن تمرير اسم الفرع المرغوب git push origin [master]
- 2 اجابة
-
- 1
-
-
يمكننا معرفة المعرف الخاص بآخر عملية إضافة في MySQL باستخدام PHP كالتالي: عن طريق غرض الاتصال، حيث يحوي حقلا فيه قيمة المعرف المطلوب: $last_id = $conn->insert_id; وكمثال كامل للحشو و الاستعلام عن المعرف إليك الشيفرة البسيطة التالية: MySQLi Object-oriented <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; if ($conn->query($sql) === TRUE) { $last_id = $conn->insert_id; echo "New record created successfully. Last inserted ID is: " . $last_id; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?> أو إن كنت لا تستخدم البرمجة غرضية التوجه: MySQLi Procedural <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; if (mysqli_query($conn, $sql)) { $last_id = mysqli_insert_id($conn); echo "New record created successfully. Last inserted ID is: " . $last_id; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?>
- 1 جواب
-
- 1
-
-
توفر axios دعم ل jest بدون أي مكاتب خارجية: import * as axios from "axios"; // عمل طلبات وهمية لجميع المستويات, get, put, delete and post: jest.mock("axios"); // ... get test("good response", () => { axios.get.mockImplementation(() => Promise.resolve({ data: {...} })); // ... }); test("bad response", () => { axios.get.mockImplementation(() => Promise.reject({ ... })); // ... }); وحتى يمكننا تحديد parameters: axios.get.mockImplementation((url) => { if (url === 'www.example.com') { return Promise.resolve({ data: {...} }); } else { //... } }); يمكنك القراءة أكثر من التوثيق الذي يحوي التغييرات لآخر إصدار: jestjs/mock-functions
- 2 اجابة
-
- 1
-
-
لايمكن تغيير قيمة المكونات بعد الإنشاء إلا عن طريق تغيير الحالة. يجب علينا في هذه الحالة عمل مستمع أحداث و ربطه ب componentDidMount بعمل bind ب this و سوف تصبح الشيفرة: componentDidMount: function() { window.addEventListener('scroll', this.handleScroll); }, componentWillUnmount: function() { window.removeEventListener('scroll', this.handleScroll); }, handleScroll: function(event) { let componentStyle = { backgroundColor: 'white' }; if (..) this.setState({ componentStyle.backgroundColor = 'black' }); }, أو يمكنك تطبيق الدالة التي تغير اللون بتطبيق مستمع حدث التمرير مباشرة على العنصر: <ScrollableComponent onScroll={this.handleScroll} />
- 2 اجابة
-
- 1
-
-
سنعمل على حساب عدد الصور التي تم تحديدها، أي استدعاء الدالة _onAddImageClick حسب فهمي للشيفرة فاستدعائها يتكرر مع كل تحديد للصورة. يمكنك تعريف متغير قبل الدالة، وعلينا زيادته ب 1 بعد كل استدعاء أي: var _imageCounter = 0; ^^^^^^^^^^^^^^^^^^ Future _onAddImageClick(int index, int type) async { if (images != null) setState(() { _imageCounter ++; ______^^^^^^^^^^^^^^^^ // ignore: deprecated_member_use _imageFile = ImagePicker.pickImage( source: type == 1 ? ImageSource.camera : ImageSource.gallery, imageQuality: 50, ); getFileImage(index); }); } وفي الحلقة: for(int i=0;i < _imageCounter ;i++) ^ ^^^^^^^^^^^^^ أصغر تماما لكي لا نجلب صورة إضافية
- 9 اجابة
-
- 1
-
-
يمكننا تغيير حالة الزر ل disabled أي نقوم بإلغاء تفعيله كالتالي: تعويض قيمة null للدالة onPressed onPressed : null RaisedButton( child: Text("PRESS BUTTON"), onPressed: booleanCondition ? () => myTapCallback() : null ) // booleanCondition متغير أو باستخدام متغير، في دالة onPressed نغيير حالة الزر: class _MyHomePageState extends State<MyHomePage> { bool _isButtonDisabled; @override void initState() { _isButtonDisabled = false; } void _incrementCounter() { setState(() { _isButtonDisabled = true; _counter++; }); } وفي شيفرة الزر نحدد الدالة التي ستنفذ بناءاً على حالة المتغير: Widget _buildCounterButton() { return new RaisedButton( child: new Text( _isButtonDisabled ? "Hold on..." : "Increment" ), onPressed: _isButtonDisabled ? null : _incrementCounter, ); }
-
حسنا، للتأكد أن id يتم تمريره بشكل صحيح نحاول طباعته في جسم التابع: const deleteUser = (id) => { console.log(id); // تأكد axios .delete(`${baseURL}users/${id}`) .then((res) => { const users = users.filter((item) => item.id !== id); setUsers(users); }) .catch((error) => console.log(error)); }; لاحظ أن الاستدعاء لايقوم بتمرير id يفضل وضع اسم متغير مختلف في الجزء: const newUsers = users.filter((item) => item.id !== id); setUsers(newUsers);
-
أعتقد أنك أشرت لمكان الخطأ، لاحظ أن الرابط مكتوب بطريقة خطأ ينقصعه كتابة / قبل users : .delete(`${baseURL}/users/${id}`) ^^^ وسوف يعمل بالشكل المطلوب.
-
هل يمكنك مشاركة التعديلات التي قمت بها من فضلك. imagecode تتولد تلقائيا ب 6 عنصر ومن ثم لكل عنصر ضمن حلقة for يتم عمل post، يمكنك اختبار القيمة فيما اذا كانت صالحة (الصورة تم اختيارها) قبل عمل الاتصال أو تحديد عدداد Counter بعدد الصور المختارة لتمشي إليه الحلقة ولا تمر على جميع ال 6 عناصر.
- 9 اجابة
-
- 1
-
-
يوجد متغير في بيئة أندرويد يشير مباشرة لمجلد التحميل Downloads : Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); حيث يتم جلبه من متغيرات البيئة Environment. حيث نمرر هذه القيمة للدالة getExternalStoragePublicDirectory المسؤولة عن جلب مسار المجلدات الخارجية العامة. طبعا لا تنسى إعطاءسماحية الوصول: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> في Android Mainfest. مسار تخزين الملف: final String relativeLocation = Environment.DIRECTORY_DOWNLOADS + File.separator + “YourSubforderName”; للتأكد من المسار يمكنك طباعة القيمة التالية (مثلا في Toast أو log) File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); dir.getAbsolutePath()
- 4 اجابة
-
- 1
-
-
يمكننا إضافة TextWatcher للحقل edit text عن طريق الدالة afterTextChanged التي تنفذ حدثا ما بعد التوقف عن الكتابة: يمكنك الاستفادة من الشيفرة التالية: TextWatcher inputTextWatcher = new TextWatcher() { public void afterTextChanged(Editable s) { textview.setText(s.toString()); // تعديل عنصر العرض المستهدف } }; editText.addTextChangedListener(inputTextWatcher); // جعل مستقل حدث التغيير مرتبط مع حقل الإدخال إذا أردت تغييرات لحظية استبدال الدالة after text change بالدالة onTextChage: TextWatcher inputTextWatcher = new TextWatcher() { public void onTextChanged(CharSequence s, int start, int before, int count) { textview.setText(s); //... } }; editText.addTextChangedListener(inputTextWatcher); توثيق: android/text/TextWatcher
- 1 جواب
-
- 1
-
-
لعمل شرط فيماإذا كانت سلسلة محتواة في أخرى يمكننا استخدام التعليمة in: حيث أنها تعيد true | false x="you are the best" if 'the' in x: print("yes") للبحث عن موقع الكلمة نستخدم الدالة find: index = x.find("the") print(index) حيث تعيد دليل العنصر (0 إلى طول السلسة - 1) في حال كان موجود، وإلا تعيد -1.
- 2 اجابة
-
- 2
-
-
لاحظ هذه: children: List.generate(images.length, (index) { . . .. imagecode.add(base64Image); هنا الحلقة تمر على جميع عناصر images وهم 6 ويتم إضافة صورة ل imagecode ثم في تابع آخر يتم رفع جميع هذه ال imagecode أي 6 أيضا. for(int i=0;i<=imagecode.length;i++){ await http.post(uploadEndPoint, body: { "image": imagecode[i], "NameImage": name[i], حاول اختبار القيمة المبدئية مثلا ستكون add image و إذا تغيرت قم بزيادة العداد ب 1 ثم اجعل هذه الحلقة تتكرر بعدد الصور المعدلة فقط.
- 9 اجابة
-
- 1
-
-
سبب رفع 6 صور، بسبب تهيئة قائمة الصور ب6 عناصر في هذه الجزئية: void initState() { super.initState(); setState(() { images.add("Add Image"); images.add("Add Image"); images.add("Add Image"); images.add("Add Image"); images.add("Add Image"); images.add("Add Image"); }); } ثم تقوم بالمرور عليهم بحلقة for وتنفذ الشيفرة فتتكرر العملية عدة مرات
- 9 اجابة
-
- 1
-
-
في لغة جافا، لا يمكن إعادة أكثر من قيمة من دالة (مثلا لديك تعيد سلسلة نصية و مصفوفة) يجب أن تعيد متغير واحد. والمتغير الذي تعيده دالة يجب أن يكون من نفس نمطها حيث لديك دالة تعيد متغير int و أنت تحاول إعادة سلسلة نصية أو مصفوفة وهذا لا يمكن. كما أن إعادة مصفوفة بكون بذكر اسمها بدون أقواس. لكي تعيد مصفوفة أرقام صحيحة عدل تعريف الدالة للتالي: int[] arrayConvert(.....) بإضافة الأقواس المربعة بعد int. ثم إعادة القيمة تكون: if (validity) return outputArray; كما أنه لتنفيذ تعليمتين بعد تحقيق شرط يتوجب كتابة أقواس مجعدة لتعليمة if : if (true) { do(); do2(); ... } لحل مشكلة valid أقترح حاليا طباعتها لل console: System.out.print لتصبح الشيفرة: int[] arrayConvert(int inputArray[], const char outputArray[], int size) { bool validity = true; for (int i = 0; i< size; i++){ if ((inputArray >= 0) && (inputArray < 128)) outputArray[i] = (char)inputArray[i]; else{ validity = false; for (int i = 0; i< size; i++) outputArray[i] = '.'; break; } } if (validity) System.out.println("Valid"); else System.out.println("Invalid"); return outputArray; } اقتصرت على تعليمة return واحدة و تعليمتي طباعة كأبسط حل للمشكلة. لكي تعيد قيمتين يجب أن يكون نوع الدالة مثلا: Map<String, Number> أو أن تتعلم Tuple وهذا ليس ضروري حاليا.
- 3 اجابة
-
- 1
-
-
لتجميع عدة أسطر من جدول في قاعدة البيانات والاستعلام عنها سويا، يمكننا وضع حقل جديد للجدول باسم Topic مثلا ونضعه بنفس القيمة لكل الأسطر التي تنتي له بحيث تأخذ قيمته نص أو رقم .. وعند الاستعلام عن المجموعة نمرر في عبارة SELECT هذا الحقل مع القيمة المناسبة ل Topic ليعيد لنا الأسطر التي نريدها. SELECT * form PHOTOS where topic = 'e-commerce'; بفرض لديك 4 صرور لموضوع التجارة الالكترونية سيقوم هذا الاستعلام بجلبهم. بعد جلب روابط الصور، يمكنك تحميلهم بأي طريقة ترغب ضمن Flutter.
- 3 اجابة
-
- 1
-
-
ملاحظة عامة: اسم الدالة البانية يطابق اسم الصنف الخاص بها. يمكننا تعريف الخاصيات لصنف ما بلغة جافا بالطريقة التالية: public class Main { int x = 5; public static void main(String[] args) { Main myObj = new Main(); System.out.println(myObj.x); } } حيث قمنا بالتالي: تعريف متغير عدد باسم X ثم في الدالة الرئيسية main: إنشاء غرض Object من هذا الصنف طباعة الخاصية X من الغرض مثال لاستعمال الدالة البانية: public class Main { int modelYear; String modelName; public Main(int year, String name) { modelYear = year; modelName = name; } public static void main(String[] args) { Main myCar = new Main(1969, "Mustang"); System.out.println(myCar.modelYear + " " + myCar.modelName); } } حيث قمنا بإسناد قيم للسنة و الاسم من خلال الدالة البانية (التي لها نفس اسم الصنف). بالنسبة للمصفوفات و غيرها من المتغيرات غير ثابتة الطول وليست primitive أو أنماط بسيطة يمكننا بنائها ضمن الدالة main: import java.util.ArrayList; public class Main { ArrayList<String> cars; public static void main(String[] args) { cars = new ArrayList<String>(); cars.add("Volvo"); cars.add("BMW"); cars.add("Ford"); cars.add("Mazda"); System.out.println(cars); } } حيث قمنا بتعريف قائمة، ثم بنائها في main ثم إضافة قيم لها و طباعتها. ومن خلال الدالة البانية: import java.util.ArrayList; public class Main { String[] cars; public Main() { cars = new String[4]; } public static void main(String[] args) { myCarObj = new Main(); myCarObj.cars[0] = ["Volvo"]; myCarObj.cars[1] = ["BMW"]; myCarObj.cars[2] = ["Ford"]; myCarObj.cars[3] = ["Mazda"]; for (int i=0;i<4;i++) System.out.println(myCarObj.cars[i]); } } تعريف مصفوفة من نوع String لكي نخزن سلاسل نصية، ثم بناء المصفوفة في الدالة البانية. أما في الدالة الرئيسية تم تعريف غرض من الصنف وبهذه اللحظة يتم استدعاء الدالة البانية التي تقوم بإنشاء المصفوفة وبعدها يمكننا الوصول لهذه المصفوفة من اسم الغرض حيث أسندنا بعض القيم ومن ثم الطباعة.
-
بشكل عام يمكن الاتصال من هاتف أندرويد على سيرفر محلي عن طريق الواي فاي، سوف يتصل الهاتف على IP الحاسوب في شبكة الانترنت المحلية التي يقوم ببثها Router المنزلي مثلا. (يمكنك معرفة IP حاسوبك من خلال خصائص شبكة WIFI التي أنت متصل عليها) سيكون الرابط على الشكل: رقم 8 مختلف حسب شبكتك. http://192.168.1.8/api/v1/products بالنسبة للاتصال عن طريق USB: تشغيل USB debugging في هاتفك. ادخل في متصفح كروم على : chrome://inspect اضغط على Port forwarding وقم بتفعيله. يمكنك الآن الدخول للمتصفح في هاتفك للرابط : localhost:3000 وسيعمل التطبيق. نعم localhost. في حال ظهور أخطاء يجب إرفاقها مع السؤال لنعرف حل المشكلة لأن هذا السؤال غير واضح. للبحث في الانترنت عن طرق مختلفة ابحث عن: test / run node application on real device
- 3 اجابة
-
- 2
-