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

عبدالرحمن العنزي4

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

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

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

أجوبة بواسطة عبدالرحمن العنزي4

  1. السلام عليكم انا لدي مشكلتين دائما ما تحدث لدي في برنامج أندرويد ستوديو وكلاهما تحدث عندما أضغط على build او rebuild your project.

    1- أولا مشكلة "daemon compilation failed "

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

    2- المشكلة الثانيه هي " invalid date string"

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

     

    شكرا لمن يساعد

    )في الصور تجدون المشكلتين(

    ٢٠٢٣١١١٨_٢٢٠٣٥٥.jpg

    ٢٠٢٣١٢١٨_٢٣٥٩٠١.jpg

  2. السلام عليكم ورحمة الله وبركاته، في عدة برامج مشابهة لتطبيقي يوجد فيها recyclerview مع اعلان بيني يخرج عندما يضغط المستخدم على الitemview منها ويقوم التطبيق بأظهار الاعلان على كامل الشاشه لعدة ثوان ثم يتحرك الى الصفحة التاليه عندما يغلق المستخدم الاعلان. في تلك التطبيقات هناك خاصية مشابهه لعداد فعندما يضغط المستخدم بشكل عشوائي على الitemviews ثلاث مرات كمثال يقوم بأظهار الاعلان واما اذا ضغط مرة او مرتين لا يظهر الاعلان الكامل - فكيف انا استخدم مثل هذه الخاصية في تطبيقي مع العلم انا استخدم جافا او كوتلن واستخدم Admob لعرض الاعلانات.

    • أعجبني 1
  3. السلام علكم ورحمة الله وبركاته, أنا أعمل على تطبيق من activity واحدة بأستخدام navigation component. والان انا انتهيت من تنفيذ أغلبيته وأريد أضافة اعلان صغير من نوع native ad من admob لكن للاسف لا يوجد الكثير من المعلومات في قوقل بهذا الخصوص وأغلب المعلومات أما قديمة أو بلغات برمجية لا أعرفها وكذلك مستندات قوقل للمطورين شرحهم للموضوع مبهم وغير مفهوم وانا أريد تصميم اعلان من نفسي وعرضة للمستخدمين في نفس الـactivity بأستخدام اما Linear layout او Frame layout. كيف يمكنني فعل هذا ؟ 

    وشكرا لكم

    بأمكانك أستخدام جافا أو kotlin للشرح 

    ملاحظة جميع معرفات admob من appId و app unitId 

    My manifest

     <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="@string/appId"/> // it is a sample

    My nativead .xml

    <?xml version="1.0" encoding="utf-8"?>
    <com.google.android.gms.ads.nativead.NativeAdView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_margin="3dp"
            android:background="@drawable/linear_border_style">
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Ad"
                    android:textColor="@color/white"
                    android:background="@color/blue"
                    android:backgroundTint="@color/blue"
                    android:textSize="15sp"/>
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">
                    <ImageView
                        android:id="@+id/nativeAdSmallImage"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:src="@drawable/ic_email"/>
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">
                    <TextView
                        android:id="@+id/nativeAdSmallTitle"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="15sp"
                        android:layout_marginStart="10dp"
                        android:textStyle="bold"
                        android:textColor="@color/black"
                        android:text="Ad Title"/>
                    <com.google.android.gms.ads.nativead.MediaView
                        android:id="@+id/nativeAdSmallMedia"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"/>
                    <TextView
                        android:id="@+id/nativeAdSmallName"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="10sp"
                        android:layout_marginStart="10dp"
                        android:textColor="@color/black"
                        android:text="Ad description"/>
                    <TextView
                        android:id="@+id/nativeAdSmallDesc"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="13sp"
                        android:layout_marginStart="10dp"
                        android:textColor="@color/black"
                        android:text="Ad description"/>
                    <Button
                        android:id="@+id/nativeAdSmallButton"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="10dp"
                        android:layout_marginEnd="10dp"
                        android:text="visit site"/>
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
    
    </com.google.android.gms.ads.nativead.NativeAdView>

    My main Activity

     

    frame = findViewById(R.id.myAd)
    
        MobileAds.initialize(this)
        val adBuilder = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110") // the unitId is a sample
            .forNativeAd { nativeAd ->
    
         
    
                 desplayNativeAd(frame, nativeAd)
    
    
            }
        adBuilder.build()
    }
    fun desplayNativeAd(parent: ViewGroup, ad: NativeAd){
        val inflater = parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)
                as LayoutInflater
        val adView = inflater.inflate(R.layout.native_small_adview, parent) as NativeAdView
    
        
        val headlineView = adView.findViewById<TextView>(R.id.nativeAdSmallTitle)
        headlineView.text = ad.headline
        adView.headlineView = headlineView
    
        val advertiser = adView.findViewById<TextView>(R.id.nativeAdSmallName)
        advertiser.text = ad.advertiser
        adView.advertiserView = advertiser
    
        val imageAdView = adView.findViewById<ImageView>(R.id.nativeAdSmallImage)
        Glide.with(this)
            .load(ad.icon)
            .into(imageAdView)
    
       
    
        val mediaView = adView.findViewById<MediaView>(R.id.nativeAdSmallMedia)
        adView.mediaView = mediaView
    
        
        adView.setNativeAd(ad)
    
        parent.removeAllViews()
    
        parent.addView(adView)
    }

    My mainActivity.xml  // I have a lot of xml code on this one but I only showed this, this is a framelyout that spposed to handle the the native ads

    <LinearLayout
    
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    
        <FrameLayout
            android:id="@+id/myAd"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>

     

  4. السلام عليكم ورحمة الله وبركاته, أنا لدي عدة مشكلات قمت بالبحث عنها لكن للأسف كل المواقع لا تتكلم عن مشكلتي, أنا لدي تطبيقين مربوطان على Firebase واحد للمستخدم والأخر لأضافة المعلومات ووضعها في قاعدة بيانات  real time . أنا الأن أريد أن أضيف firebase cloud messaging الى تطبيق المطور وتطبيق المستخدم وأريد أن أرسل أشعار كل ما أكتب على الـEdit Text  الى firebase cloud messaging وأستقبلها في تطبيق المستخدم , كيف أفعل مثل هذا الشيء؟ بحثت تقريبا في كامل google ولم أجد أجابة!

  5. السلام عليكم ورحمة الله وبركاته, أنا لدي تطبيق مربوط على Fire Base ويتم سحب البيانات الى recycler-view موجودة في صفحة من fragment وكل ما أضغط على رقم معين يتم أرسالي الى fragment اخرى لأكمال بقية الخبر وبحمد الله التطبيق يعمل بشكل جيد, لكن الأن أنا اريد أضافة أشعار الى التطبيق كل ما أريد أن أضيف child ومعلوماتة الى fire base وأريد ان أسحب فقط العنوان و ملخص الخبر وأضافتهم الى الاشعار وأريد أيضا كل ما أضغط على أشعار معين يتم ارسالى الى fragment الخبر وليس الصفحة التي يتواجد بها recycler-view !!. هل هناك طريقة معينه لتنفيذ هذه الفكرة؟ علما بأني جربت طريقتي لكن الاشعار وحدة من يظهر بدون العنوان او الملخص وايضا ولا يتم فتح البرنامج عند الضغط على الاشعار؟

    الذي أريدة هو :

    1. أشعار في كل وقت أضيف فيه child جديد الى fire base  يحتوي على title و description ويتم أرسالة مباشرة
    2. كل ما يتم الضغط على الاشعار يتم توجيه المستخدم الى صفحة الخبر 

    ملاحظة : أنا أستخدم navigation graph في التنقل بين الملفات و save args في نقل البيانات

    - تستطيع استخدام java او kotlin ان أردت

     

     class MyApp 

    class MyApp() : Application() {
        val n_ID_Channel = "أشعار اخر الأخبار"
        override fun onCreate() {
            super.onCreate()
    
          
            createNotificationChannel()
        }
    
        fun createNotificationChannel(){
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                val channel_name = "أشعار صفحة الأخبار"
                val description_text = "القسم الخاص لأشعارات صفحة الأخبار"
    
                val name = channel_name
                val text = description_text
                val importance = NotificationManager.IMPORTANCE_HIGH
                val channel = NotificationChannel(n_ID_Channel, name, importance).apply {
                    description = text
                }
                val notificationManager : NotificationManager =
                    getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    
                notificationManager.createNotificationChannel(channel)
            }
        }
    
    }

     

    LatestNewsFragment

     

    
    class LatestNewsFragment : Fragment() {
    
        private lateinit var news_list: ArrayList<NewsListViewModel>
        private lateinit var mRef: DatabaseReference
        private lateinit var recyclerView: RecyclerView
        private lateinit var progress : ProgressBar
        private lateinit var layout : LinearLayout
    
        private lateinit var pendingIntent: PendingIntent
    
    
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            // Inflate the layout for this fragment
            val view = inflater.inflate(R.layout.fragment_latest_news, container, false)
    
            return view
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
    
    
            recyclerView = view.findViewById<RecyclerView>(R.id.newsList)
            recyclerView.layoutManager = LinearLayoutManager(
                context,
                LinearLayoutManager.VERTICAL,
                false
            )
    
            news_list = arrayListOf<NewsListViewModel>()
    
            progress = view.findViewById(R.id.progress_news)
            layout = view.findViewById(R.id.progress_layout)
        }
    
        override fun onStart() {
            realTimeNewsDataBase(requireView())
            val refresh = view?.findViewById<SwipeRefreshLayout>(R.id.refresh_layout)
    
            refresh?.setOnRefreshListener(object : SwipeRefreshLayout.OnRefreshListener {
    
                override fun onRefresh() {
                    realTimeNewsDataBase(requireView())
                    refresh.isRefreshing = false
                }
    
            })
    
            super.onStart()
    
        }
    
        fun realTimeNewsDataBase(view: View) {
            progress.visibility = View.VISIBLE
            val data_base = FirebaseDatabase.getInstance()
            mRef = data_base.getReference("LatestNews")
    
            mRef.addValueEventListener(object : ValueEventListener {
    
                override fun onDataChange(snapshot: DataSnapshot) {
                    news_list.clear()
    
                    if (snapshot.exists()) {
                        for (list in snapshot.children) {
                            var data = list.getValue(NewsListViewModel::class.java)
                            news_list.add(0,data!!)
    
                            progress.visibility = View.GONE
                        }
                        val adapter = NewsListAdapter(
                            requireContext(),
                            news_list, view
                        )
                        recyclerView.adapter = adapter
                    }
                }
    
    
                override fun onCancelled(error: DatabaseError) {
                    Log.w(TAG, "onCancelled", error.toException())
                    Toast.makeText(context, "${error.message}", Toast.LENGTH_SHORT).show()
                    progress.visibility = View.GONE
                }
    
            })
            mRef.addChildEventListener(object : ChildEventListener{
    
                override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) {
                  
                  // من المفترض هنا يتم ارسال الاشعار الى التطبيق عند اضافة بيانات جديدة
                    val data = NewsListViewModel()
    
                    N_NotifictionData(data.title, data.desc)
                }
    
    
                override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {
                    Toast.makeText(context, "${previousChildName} was changed", Toast.LENGTH_SHORT).show()
                }
    
    
                override fun onChildRemoved(snapshot: DataSnapshot) {
                    Toast.makeText(context, "$snapshot was removed", Toast.LENGTH_SHORT).show()
                }
    
    
                override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {
                    Toast.makeText(context, "${previousChildName} was moved", Toast.LENGTH_SHORT).show()
                }
    
    
                override fun onCancelled(error: DatabaseError) {
                    Toast.makeText(context, "${error.message} was changed", Toast.LENGTH_SHORT).show()
                }
    
            })
        }
        fun N_NotifictionData( title : String? = null, desc : String? = null){
            val i = Intent(requireContext(), NewsDetailFragment :: class.java).apply {
                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            }
             pendingIntent = PendingIntent.getActivity(requireContext(), 0, i, 0)
    
            val builder = NotificationCompat.Builder(requireContext(), MyApp().n_ID_Channel)
                .setSmallIcon(R.drawable.ic_email)
                .setContentTitle(title)
                .setContentText(desc)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setDefaults(NotificationCompat.DEFAULT_ALL)
                .setContentIntent(pendingIntent)
                .setAutoCancel(true)
    
            with(NotificationManagerCompat.from(requireContext())){
                notify(1, builder.build())
            }
        }
    
    
    
    }

     

    NewsDetailsFragment 

     

    package com.gazelle.wadifatk.newsList
    
    import android.os.Bundle
    import androidx.fragment.app.Fragment
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.ImageView
    import android.widget.TextView
    import android.widget.Toast
    import androidx.navigation.fragment.navArgs
    import com.bumptech.glide.Glide
    import com.gazelle.wadifatk.OverLoad
    import com.gazelle.wadifatk.R
    import com.klinker.android.link_builder.Link
    import com.klinker.android.link_builder.applyLinks
    import java.text.DateFormat
    import java.util.*
    
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    
    class NewsDetailFragment : Fragment() {
    
        val args: NewsDetailFragmentArgs by navArgs()
        private lateinit var overLoad : OverLoad
        private lateinit var share : ImageView
        
       
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_news_detail, container, false)
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            overLoad = OverLoad(requireContext())
    
            val text = view.findViewById<TextView>(R.id.information_text)
            val image = view.findViewById<ImageView>(R.id.image_view)
            val title = view.findViewById<TextView>(R.id.title_news)
            val date = view.findViewById<TextView>(R.id.date_news)
            val type = view.findViewById<TextView>(R.id.type_news)
            val desc = view.findViewById<TextView>(R.id.desc_news)
            val details = view.findViewById<TextView>(R.id.news_details)
            share = view.findViewById(R.id.share_N)
    
            val image1 = args.newsDataList.image
            Glide.with(view)
                .load(image1)
                .into(image)
            val title1 = args.newsDataList.title
            title.text = "" + title1
    
            val date1 = args.newsDataList.date
            date.text = "" + date1
            val type1 = args.newsDataList.type
            type.text = type1
            val desc1 = args.newsDataList.desc
            desc.text = desc1
            val details1 = args.newsDataList.details
            details.text = details1
    
         
        }
    
      
    }

    وهذه صورة للأشعار 

     

     

    WhatsApp Image 2021-12-10 at 4.44.42 PM.jpeg

  6. بتاريخ 19 ساعات قال محمد يمان ويس:

    وعليكم السلام,
    يجب أن تستعدي مكتبة android.text.method.LinkMovementMethod ومن ثم تقوم بتنفيذ إجرائية setMovementMethod والتي تأخذ باراميتر linkMovementMethod.getInstance() 
     من ثم تقوم بتعريف متحول String وقيمته هي الرابط بواسمة anchor من HTML وقيمة الhref فيها هو الرابط, وتمرر هذا المتحول إلى إجرائية html.fromHTML كما في المثال أدناه.

    ملاحظة: قد تحتاج إلى تفعيل خاصية clickable للtextView.

    
    TextView textView =(TextView)findViewById(R.id.textView);
    textView.setClickable(true);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    String text = "<a href='http://www.google.com'> Google </a>";
    textView.setText(Html.fromHtml(text));
     
    لقراءة الخطوات بشكل تفصيلي يمكنك متابعة المقال التالي:
    https://www.geeksforgeeks.org/how-to-add-hyperlink-to-textview-in-android/

    أجابتك تعمل على نوع Edit text فقط ولا تتفعل اذا ارسلت القيمة الى Text view من الـ Edit text وكذلك نوع متغير text لديك خاطئ -  الي عمل معي ونقلها الى الاديت تيكست هو هذا: 

    String text = "<a href=\"http://www.google.com/\"> Google </a>";

     

    • أعجبني 1
  7. السلام عليكم ورحمة الله وبركاته, أنا حاليا أعمل على تطبيق أدمن لتطبيقي الاخر على الـFireBase. وفي هذا التطبيق لدي عدة أنواع من الـ Edit Texts, ومن ضمنها Edit Text لكتابة المقالات وأظهارها في  String موجود في الفايربيس وايضا أظهارها في Text view موجودة تحت نفس الـEdit Text. أنا أريد أن أضيف خاصية hyperlink لأي كلمه أريدها من هذا الـEdit Text واربط معها رابط كل ما يضغط المستخدم عليها يوجهه الى متصفح الانترنت مع الرابط الموجود بالكلمة في text view.. أنا الأن أعرف كيف اجل الكلمات تأخذ خاصية الـ Bold لكن لا أعرف كيف أربطها مع Hyperlink..

    مع العلم انا جربت هذه "المكتبة" لكن لا تعطيني الذي انا اريدة..

    My Fragment 

    class MainFragment : Fragment() {
    
    var num = 1
    var string = ""
    
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_main, container, false)
    }
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        val article = view.findViewById<EditText>(R.id.article_edit)
        val boldBtn = view.findViewById<ImageView>(R.id.bold_button)
        val linkBtn = view.findViewById<ImageView>(R.id.linkBtn)
        val text = view.findViewById<TextView>(R.id.text)
        val linkString = view.findViewById<TextView>(R.id.link_string)
        val linkUrl = view.findViewById<TextView>(R.id.LinkUrl)
        val savelinkBtn = view.findViewById<Button>(R.id.saveLinkBtn)
    
    
        linkString.visibility = View.GONE
        linkUrl.visibility = View.GONE
        savelinkBtn.visibility = View.GONE
    
        boldBtn.setOnClickListener {
            val spannableString = SpannableString(article.text)
            spannableString.setSpan(
                StyleSpan(Typeface.BOLD), article.selectionStart, article.selectionEnd, 0
            )
            article.setText(spannableString)
            text.text = article.text
    
            string = article.text.toString()
        }
        linkBtn.setOnClickListener {
    
            if (num == 1) {
                linkString.visibility = View.VISIBLE
                linkUrl.visibility = View.VISIBLE
                savelinkBtn.visibility = View.VISIBLE
    
                num = 0
            } else {
                linkString.visibility = View.GONE
                linkUrl.visibility = View.GONE
                savelinkBtn.visibility = View.GONE
                num = 1
            }
            savelinkBtn.setOnClickListener {
               text.text = string
                linksToText(string)
                
            }
    
        }
    
    }
    
    fun linksToText(link: String) {
        var Link = Link(link)
            .setOnClickListener {
                Toast.makeText(context, "clicked", Toast.LENGTH_SHORT).show()
            }
    
        val article = requireView().findViewById<EditText>(R.id.article_edit)
        val text = requireView().findViewById<TextView>(R.id.text)
    
        article.applyLinks(Link)
        text.applyLinks(Link)
    
    }

     

    • أعجبني 1
  8. بتاريخ On 8‏/10‏/2021 at 18:09 قال Hassan Hedr:

    تقوم أولا بتعريف مصفوفة لعناوين المواعيد بنفس الترتيب الذي يرجعه الصف PrayTime ويجب أن يكون تصاعديا (في الشيفرة قد يبدو الترتيب معكوسا بسبب اتجاه اللغة العربية)

    
    String[] salahNames = { "الفجر", "الصبح", "الظهر", "العصر", "المغرب", "العشاء" };

    نقوم بالمرور على كافة المواعيد بالترتيب، ونقارن الوقت الحالي بتوقيت كل موعد، عند أول توقيت لا يكون قد مضى نكون حاليا عند الموعد القادم

    
    for (int i = 0; i < salahNames.length; i++) {
      // اسم الموعد الحالي
      String salahName = salahNames[i];
      
      // توقيت الموعد الحالي
      String salahTimeString = times.get(i);
      LocalTime salahTime = LocalTime.parse(salahTimeString, DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH));
      
      // التوقيت الآن
      LocalTime currentTime = LocalTime.now();
    
      // اذا كان الموعد الحالي هو القادم
      if (salahTime.isAfter(currentTime)) { 
    
        // نقوم بحساب الوقت المتبقي وننهي الحلقة ...
        break;
      }
    }

    تقوم بحساب الوقت المتبقي للموعد القادم ابتداءا من الوقت الحالي، وانشاء النص وتحديث الواجهة

    
    if (salahTime.isAfter(currentTime)) {
      // الوقت المتبقي
      Duration diff = Duration.between(salahTime, currentTime);
      
      // الساعات والدقائق
      long hours = diff.toHours();
      long minutes = diff.minusHours(hours).toMinutes();
    
      // بناء نص الإظهار
      String timeLeftToNextSalah = "";
    
      if (hours > 0) { // اضافة الساعات فقط اذا كان التوقيت اكثر من ساعة
        timeLeftToNextSalah += hours + " ساعات";
        timeLeftToNextSalah += " و ";
      }
      timeLeftToNextSalah += minutes + " دقيقة";
    
      // نحدث الواجهة باسم الموعد القادم والوقت المتبقي
      findViewById<TextView>(R.id.NextSalahName).text = salahName;
      findViewById<TextView>(R.id.NextSalahTimeLeft).text = timeLeftToNextSalah;
      
      break;
    }

    يمكنك إعادة تنفيذ ما سبق والتحديث كل دقيقة عبر استخدام Timer كالتالي

    
    Timer timer = new Timer();
    
    timer.schedule( new TimerTask() {
        public void run() {
           // إعادة الحساب وتحديث الواجهة 
        }
     }, 0, 60*1000); // كل دقيقة

     

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

    • أعجبني 1
  9. بتاريخ 3 ساعات قال Wael Aljamal:

    تريد عرض أقرب صلاة؟

    أنا أستطيع عرض الصلاوات كاملة .. انا اريد فقط ان أعرف كيف احسب الوقت المتبقي من مثلا صلاة الفجر الى موعد الشروق ومن موعد الشروق الى صلاة الظهر.. الخ .. اريد ان اعرف كيف احسب صلاة الفجر "4:43" من الوقت الحالي وعندما ينتهي اريد ان يحسب الوقت المتبقي لموعد الشروق "6:06" وهكذا

    • أعجبني 1
  10. بتاريخ 1 ساعة قال Wael Aljamal:

    حاول توضيح المشكلة، وأرفق صور للنتائج، وماذا يعيد كلاس الجافا ولأي مرحلة وصلت بكتابة شيفرتك لحساب الفروقات..

     

    تم ذكر الذي يعيدة يا أخي الكريم .. كلاس الجافا يعيد اوقات من الفجر الى العشاء مثلا يعيد صلاة الفجر كذا :" 4:43 am" و صلاة الظهر :" 12:09 pm".. الخ, فأنا أريد معرفة الوقت المتبقي الاوقات المعطاه من الكلاس كمثال اريدة هكذا :" المتبقي لصلاة الفجر 4 ساعات و 30 دقيقة" وحال وصول الوقت اريدة ان ينتقل الى الصلاة الاخرى

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

    انا لدي "java class" في تطبيقي  "أضغط هنا لرؤية الكود" يتم فيه حساب الصلوات اليومية من صلاة الفجر الى صلاة العشاء, وهذا الشيء يعمل لدي بشكل جيد ولله الحمد. والان انا اريد ان أضيف text view يقوم بحساب المتبقي لصلاة من الوقت الحالي, كمثال أريد بعد ان تنتهي صلاة العشاء يبدأ بالحساب لصلاة الفجر هكذا " المتبقي لصلاة الفجر 4 ساعات و 30 دقيقة"  ويتم الحساب فيه بشكل تنازلي  وما ان يصل وقت صلاة الفجر يبدأ بحساب الوقت المتبقي لموعد الشروق  ثم لصلاة الظهر وهكذا الى ما لا نهايه.

    ما أريده هو 

    • Text view يتم فيه حساب المتبقي من الصلاوات الى الوقت الحالي
    • يتم الحساب بشكل تنازلي كمثال :" المتبقي لصلاة العصر 3 ساعات و20 دقيقة" وبعد كم من الوقت يكون هكذا " المتبقي لصلاة العصر 2 ساعه و 15 دقيقة"
    • للنظر الى كود حساب الصلاوات أرجو ان تضغط هنا

    وهذا الكود الذي كتبتة لجلب بيانات الصلاة من الكلاس (يعمل بشكل جيد الا حساب الوقت المتبقي بين الصلاتين)

     val TimeId = TimezoneMapper.latLngToTimezoneString(
                                location.latitude,
                                location.longitude
                            )
    
                            val gmt = TimeZone.getTimeZone(TimeId).getDisplayName(false, TimeZone.SHORT)
    
                            val z1 = gmt.substring(4)
                            val z = z1.replace(":", ".")
                            val zo = z.toDouble()
                            val latitude: Double = location.latitude
                            val longitude: Double = location.longitude
    
                            val locationPref = getSharedPreferences("location", Context.MODE_PRIVATE)
                            val editor = locationPref.edit()
                            //    editor.putFloat("lat", lat1.toFloat())
                            //   editor.putFloat("lng", lng.toFloat())
                            locationPref.edit().putDouble("latt1", latitude).apply()
                            locationPref.edit().putDouble("lngg2", longitude).apply()
    
                            editor.apply()
    
    
                            val timeZoneId = TimeZone.getAvailableIDs()
                            val prayTime = praytime()
                            //prayTime.timeFormat = prayTime.time12 // getTime12 is protected
                            prayTime.timeFormat = prayTime.time12NS
                            prayTime.calcMethod = prayTime.makkah // Makkah
                            prayTime.asrJuristic = prayTime.shafii // Shafii (standard)
                            prayTime.adjustHighLats = prayTime.angleBased
                            // my codes
                            prayTime.timeZone = prayTime.timeZone1
                            prayTime.setFajrAngle(18.5)
                            prayTime.computeMidDay(prayTime.dhuhrMinutes.toDouble())
                            val offsets = intArrayOf(
                                0,
                                0,
                                0,
                                0,
                                0,
                                0,
                                0
                            ) // {Fajr,Sunrise,Dhuhr,Asr,Sunset,Maghrib,Isha}
    
                            prayTime.tune(offsets)
                            cal = Calendar.getInstance(TimeZone.getTimeZone(timeZoneId.toString()))
                            val now = Date()
                            cal.time = now
    
    
                            val times: ArrayList<String> =
                                prayTime.getPrayerTimes(
                                    cal, latitude, longitude, zo
                                )
                            findViewById<TextView>(R.id.Fajr).text = times.get(0)
                            findViewById<TextView>(R.id.sabah).text = times.get(1)
                            findViewById<TextView>(R.id.dhuhr).text = times.get(2)
                            findViewById<TextView>(R.id.AzanTime).text = times.get(3)
                            findViewById<TextView>(R.id.maghreb).text = times.get(4)
                            findViewById<TextView>(R.id.Esha).text = times.get(6)
                              
                              // الكود الذي تحت هذه جمله هو محاولة مني لكن للأسف بائت بالفشل
         <---------------------------------------------------------------------------------------------------------------------->  
                            
                                // this is where i coun the time difference
                            val timeFormat = DateTimeFormatter.ofPattern("hh:mm a", Locale.getDefault())
                            val time = LocalTime.now().format(timeFormat)
                            val timeTo12AM = "12:00 AM"
                            if (timeTo12AM <= time && time < times[0]) {
    
                                val timeFormat1 = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH)
                                val currentTime = SimpleDateFormat("hh:mm a", Locale.ENGLISH).format(Date())
                                val startTime = currentTime
    
                                val start = LocalTime.parse(startTime, timeFormat1)
                                val endTime = times[0]
                                val end = LocalTime.parse(endTime, timeFormat1)
                                val diff = Duration.between(start, end)
                                val hours = diff.toHours()
                                val minutes = diff.minusHours(hours).toMinutes()
                                salahName.text = "الفجر"
                                salahTimeLeft.text = "${hours}ساعات " + "${minutes} ودقيقة "
                                if (hours.equals(0)){
                                    salahTimeLeft.text =  "${minutes}دقيقة "
    
                                }
                            } else if (timeTo12AM <= time && time > times[0] && time < times[1]) {
                                val timeFormat1 = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH)
                                val currentTime = SimpleDateFormat("hh:mm a", Locale.ENGLISH).format(Date())
                                val startTime = currentTime
                                val endTime = times[1]
    
                                val start = LocalTime.parse(startTime, timeFormat1)
                                val end = LocalTime.parse(endTime, timeFormat)
    
                                val diff = Duration.between(start, end)
                                val hours = diff.toHours()
                                val minutes = diff.minusHours(hours).toMinutes()
    
                                salahName.text = "الشروق"
                                salahTimeLeft.text = "${hours}ساعات " + "${minutes} ودقيقة "
                            }else if (timeTo12AM <= time && time >times[0] && time > times[1] && time < times[4] ){
                                val timeFormat1 = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH)
                                val currentTime = SimpleDateFormat("hh:mm a", Locale.ENGLISH).format(Date())
                                val startTime = currentTime
                                val endTime = times[4]
    
                                val start = LocalTime.parse(startTime, timeFormat1)
                                val end = LocalTime.parse(endTime, timeFormat)
    
                                val diff = Duration.between(start, end)
                                val hours = diff.toHours()
                                val minutes = diff.minusHours(hours).toMinutes()
    
                                salahName.text = "المغرب"
                                salahTimeLeft.text = "${hours}ساعات " + "${minutes} ودقيقة "
                            }

     

  12. السلام عليكم ورحمة الله وبركاته, في تطبيقي لدي Bottom Sheet Fragment وفي داخلها لدي اثنين من نوع Fragments وفي واحده منهما يوجد لدي recycler view  وفي داخلها Button, فعندما يستخدم المستخدم هذا الزر اريد من الزر ان يرسل text view من نوع Title من الـ Fragment الاولى الى الـ Fragment الاخرى وايضا الزر يفتح الfragment الاخرى.

    الذي اريدة هو

    • فتح fragment عن طريق button موجود في recycler view داخل الـ Fragment الاولى
    • عندما يتم فتح الـ Fragment أريد ان ارسل لها العنوان المتواجد في recycler view

     

    ## حاولت استخدام فكرة الـ Transaction بين الـ Fragments  لكن لم أعرف كيف اطبقها بشكل جيد !!

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

    My recycler view adapter

    class tvTitleAdapter (val context: Context,val TITLE_LIST : ArrayList<TvTitlesViewModel>)
        :  RecyclerView.Adapter<tvTitleAdapter.ViewHolder>() {
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.tv_titles_design, parent, false)
            return ViewHolder(view)
        }
    
        override fun getItemCount(): Int {
            return TITLE_LIST.size
        }
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    
            val tvShow: TvTitlesViewModel = TITLE_LIST[position]
            holder.titleShow.text = tvShow.title
            holder.description.text = tvShow.description
            holder.showImage.setImageResource(tvShow.title_image)
            holder.tvTitleExpand.setOnClickListener {
                holder.description.visibility = View.VISIBLE
                holder.showImage.visibility = View.VISIBLE
                holder.tvTitleButton.visibility = View.VISIBLE
    
            }
            holder.tvTitleButton.setOnClickListener {
                when(position){
                    0->{
                        // احتاج ان ارسل العنوان الى الفراقمنت الاخرى اذا امكن ذلك
                    }
                }
            }
        }
        class ViewHolder(Itemview : View): RecyclerView.ViewHolder(Itemview){
    
            val titleShow = itemView.findViewById<TextView>(R.id.tvTitle)
            val description = itemView.findViewById<TextView>(R.id.tvDesription)
            val showImage = itemView.findViewById<ImageView>(R.id.tvImage)
            var tvTitleExpand = itemView.findViewById<CardView>(R.id.tvTitleExpand)
            val tvTitleButton = itemView.findViewById<Button>(R.id.tvTitleButton) // this is a button inside a recycler view
        }
    }

    My fragment

    class TvTitlesFragment : Fragment() {
    
    val TV_TITLE : ArrayList<TvTitlesViewModel> = ArrayList()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
    }
    
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_tv_titles, container, false)
    }
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        val adapter = tvTitleAdapter(context!!,TV_TITLE)
        tvTitles.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
        tvTitles.setHasFixedSize(true)
        tvTitles.adapter = adapter
        tvShowTitles()
    }
    private fun tvShowTitles(){
        TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))
        TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))
        TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))
        TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))
        TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))
        TV_TITLE.add(TvTitlesViewModel(R.drawable.abdelbasset_abdessamad, "برنامج على مائدة الأفطار", "برنامج على مائدة الافطار من تقديم الشيخ علي الطنطاوي رحمه الله, تم بث أول حلقة منه في عام 1960 م واستمر الى عام1992 م"))
    
    }

     

    هذه صور لتطبيقي

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

    InkedWhatsApp Image 2021-08-29 at 8.07.14 PM_LI.jpg

    WhatsApp Image 2021-08-29 at 8.07.17 PM.jpeg

    • أعجبني 1
  13. السلام عليكم ورحمة الله وبركاته, انا جديد في استخدام الـbroadcast receiver ولدي بعض الاستفسارات التي بحثت عنها ولم اجد اجابه منطقيه او لم استطع فهمها بكل جيد.

    استفساري الاول : بماذا استطيع استخدام الـ broadcast receiver غير الاشعارات؟

    أستفساري الثاني: هل استطيع استخدام broadcast receiver واحد لعدد من الاشعارات كأشعار الصلاوات مثلا كـالفجر, والظهر, والمغرب ... الخ؟

    استفساري الثالث:  أن كان بأمكاني استخدام broadcast receiver واحد كيف يمكنني ان أغير الTitle و الText ؟ 

    بحثت في عدة مواقع ولم أجد اجابة بشكل جيد..

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

    broadcast receiver

    class fajrBroadcastReceiver : BroadcastReceiver() {
    
        val CHANNEL_ID = "أذان الفجر"
    
        override fun onReceive(context: Context?, intent: Intent?) {
    
            val intent = Intent(context, MainActivity::class.java).apply {
                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            }
            val pendingIntent : PendingIntent = PendingIntent.getActivity(context,0,intent,0)
    
            val builder = NotificationCompat.Builder(context!!, CHANNEL_ID)
                .setSmallIcon(R.drawable.ic_fajr_icon)
                .setContentTitle("صلاة الفجر قد حلت")  // اريد تغيير هذا السترينق الى عدة جمل
                .setContentText("بسم الله الرحمن الرحيم")  // وهذا ايضا
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setDefaults(NotificationCompat.DEFAULT_ALL)
                .setContentIntent(pendingIntent)
                .setAutoCancel(true)
    
            with(NotificationManagerCompat.from(context)) {
                notify(123, builder.build())
            }
    
        }
    }

    Setting Activity

     

        val CHANNEL_ID = "أذان الفجر"
    
        private lateinit var alarmManager: AlarmManager
        private lateinit var pendingIntent: PendingIntent
          
           // اعداد الافتراضي
            defaultTimes.setOnCheckedChangeListener { buttonView, isChecked ->
                editor.putBoolean("DefaultTimesSwitch",isChecked)
    
                editor.apply()
    
                if (isChecked){
                    val  fajrtime = getSharedPreferences("saveSettingData", Context.MODE_PRIVATE)
    
                    calender = Calendar.getInstance()
                    calender[Calendar.HOUR_OF_DAY] = fajrtime.getInt("fajrTimeHour", 0)
                    calender[Calendar.MINUTE] = fajrtime.getInt("fajrTimeMinutes",0)
                    calender[Calendar.SECOND] = 0
                    calender[Calendar.MILLISECOND] = 0
    
                    fajrEditTxt.setHint("" + fajrtime.getInt("fajrTimeHour", 0) + ":"
                            + fajrtime.getInt("fajrTimeMinutes",0) + " AM")
    
                    alarmFajr()
    
                }else{
                    fajrEditTxt.hint = "Press"
                }
                                                     
                 
                private fun createNotificationChannel(){
                val channelName = "مؤذن الفجر"
                val DESCRIPTION_TEXT = "أشعار لأذان الفجر"
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                val name = channelName
                val description_text = DESCRIPTION_TEXT
                val importance = NotificationManager.IMPORTANCE_HIGH
                val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
                    description = description_text
                }
    
                val notificationManager: NotificationManager =
                    getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                notificationManager.createNotificationChannel(channel)
            }
    
        }
        fun alarmFajr(){
            alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager
            val i = Intent(this, fajrBroadcastReceiver::class.java)
    
            pendingIntent = PendingIntent.getBroadcast(this, 0, i,0)
    
            alarmManager.setInexactRepeating(
                AlarmManager.RTC_WAKEUP, calender.timeInMillis,
                AlarmManager.INTERVAL_DAY, pendingIntent
            )
        }

     

    انا استخدم لغة الكوتلن لكن ان اردت الاجابة بلغة الجافا لا مانع انا اعرف اترجم الجافا الى الكوتلن

    شكرا لكم ,,, 

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

    السلام عليكم @عبدالرحمن العنزي4

    لا أعلم إن كنت تقصد shared preferences في Java أم في Dart , لكن تقريباً الفكرة نفسها يمكنك عمل ذلك مثلاً في الأندرويد ستديو (Java) أو جافا إجمالاً من خلال أولاً تخزين القيمة الأولية(dynamic value) من المتغير(الذي قيمته تتغير dynamic) فلتكن مثلاً 10 كما ذكرت ومن ثم نقوم بعمل شرط إن كان القيمة الأولية (10) التي تغيرت لا تساوي القيمة المخزنة في shared pref نقوم بإفراغها(shared pref) ثم تخزين القيمة التي تغيرت برمجياً (shared pref)  قمت بعمل كود صغير يوضح ذلك برمجياً يمكنك عمله بأكثر من طريقة ويعتمد على كيف تتغير القيمة هل يتم تغييرها من خلال Api أم من خلال كود معين كل عدد معين من الثواني ,تفضل 

    
    int dynamicValue = 10; 
    SharedPreferences sharedPref = getSharedPreferences("name", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); 
    editor.putInt("dynamicKey", dynamicValue); 
    editor.commit(); 
    if (dynamicValue != sharedPref.getInt("dynamicKey",0)) { 
      /** 
      * Clear dynamicKey value with 0 * Then Insert the dynamicValue to the dynamicKey 
      */ 
      sharedPref.edit().putInt("dynamicKey",0).apply();        			  
      sharedPref.edit().putInt("dynamicKey",dynamicValue).apply(); 
    	} 

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

    • أعجبني 1
  15. السلام عليكم ورحمة الله وبركاته. انا عندي سؤال بالنسبة لshared preference. انا لم افهم طريقة عمل shared preference بشكل كامل لكن أعرف بأنه هو طريقة لحفظ الملفات في التطبيق حتى تكون مثل ماهي اذا دخلت التطبيق مرة اخرى، لكن هل هنالك طريقة لتغيير القيمه المحفوظه في المفتاح الموجود في shared preference بشكل تلقائي؟. بمعنى لو لدي متغير var او val رقمي دائما يرتفع من مثلا 10 الى 11 ثم الى 12 ثم ينزل الى11.. الخ انا مثلا اريد من shared pref ان يحفظ اولا الرقم 10 واذا تغير الى 11 تتغير القيمة المحفوظه معه بشكل تلقائي الى نفس الرقم فهل هنالك طريقة لعمل هذا الشيء؟

     

    اتمنى اكون وفقت في شرح سؤالي بأفضل طريقة ممكنه.

    • أعجبني 1
  16. السلام عليكم ورحمة الله وبركاتة, انا في الحقيقة لدي بعض المشاكل في أكواد الاشعارات بأستخدام لغة الكوتلن. في تطبيقي انا استخدم أداة "Time bicker" للمستخدم حتى يختار وقت معين وان اتى الوقت الذي قام بتحديدة يتم تفعيل الاشعار لتذكيرة بالصلاة, والحمدالله يعمل هذا النوع من الاشعار بشكل جيد. لكن أنا اريد اولا ان اضيف وقت افتراضي محدد قبل استخدام الـTime bicker  ومفعل بشكل تلقائي حتى يرسل الاشعار الى المستخدم بنفس التوقيت الى ان يستخدم المستخدم اداة "Time bicker" لتغير موعد الاشعار.

     

    فمشكلتي هي:

    1- كيف أضيف وقت افتراضي "default time" حتى يتم ارسال الاشعار الى المستخدم قبل ما يستخدم أداة time bicker حتى يتم ارسال الاشعار   بتوقيت اخر اليه؟

    2- هل يجب علي استخدام shared preference حتى يعمل الاشعار بنفس التوقيت يوميا؟

     

    أكون متشكر جدا الى اي شخص يعطيني اجابات اسئلتي او يلمح لي..

     

    Android Manifast.xml

            <receiver android:name=".AthanBrodcasts.fajrBroadcastReceiver"/>

     

    My broadcast receiver

    class fajrBroadcastReceiver : BroadcastReceiver() {
    
    val CHANNEL_ID = "أذان الفجر"
    
    override fun onReceive(context: Context?, intent: Intent?) {
    
        val intent = Intent(context, MainActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        }
        val pendingIntent : PendingIntent = PendingIntent.getActivity(context,0,intent,0)
    
        val builder = NotificationCompat.Builder(context!!, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_fajr_icon)
            .setContentTitle("صلاة الفجر قد حلت")
            .setContentText("بسم الله الرحمن الرحيم")
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setDefaults(NotificationCompat.DEFAULT_ALL)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true)
    
        with(NotificationManagerCompat.from(context)) {
            notify(123, builder.build())
        }
    
    }
    }

     

    My Setting Activity

    private lateinit var picker : MaterialTimePicker
    private lateinit var calender : Calendar
    
    val CHANNEL_ID = "أذان الفجر"
    
    private lateinit var alarmManager: AlarmManager
    private lateinit var pendingIntent: PendingIntent
    
    fajrEditTxt.setOnClickListener {
            showTimePicker()
        }
        fajrSalah.setOnCheckedChangeListener { buttonView, isChecked ->
    
            if (isChecked){
    
            }else{
    
            }
        }
    private fun showTimePicker(){
        val  fajrtime = getSharedPreferences("saveSettingData", Context.MODE_PRIVATE)
        picker = MaterialTimePicker.Builder()
            .setTimeFormat(TimeFormat.CLOCK_12H)
            .setHour(fajrtime.getInt("fajrTimeHour", 0)) // I took it from a library I use
            .setMinute(fajrtime.getInt("fajrTimeMinutes",0)) // I took it from a library I use
            .setTitleText("حدد الموعد الذي تريدة")
            .build()
    
        picker.show(supportFragmentManager, "AdhanNotifacations")
    
        picker.addOnPositiveButtonClickListener {
    
            if(picker.hour > 12){
    
                fajrEditTxt.setHint(String.format("%02d",picker.hour - 12) + ":"
                        + String.format("%02d", picker.minute) + " PM")
            }else{
                fajrEditTxt.setHint(String.format("%02d",picker.hour) + ":"
                        + String.format("%02d", picker.minute) + " AM")
            }
    
    
            calender = Calendar.getInstance()
            calender[Calendar.HOUR_OF_DAY] = picker.hour
            calender[Calendar.MINUTE] = picker.minute
            calender[Calendar.SECOND] = 0
            calender[Calendar.MILLISECOND] = 0
    
            alarmFajr()
    
        }
    }
    
    private fun createNotificationChannel(){
        val channelName = "مؤذن الفجر"
        val DESCRIPTION_TEXT = "أشعار لأذان الفجر"
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            val name = channelName
            val description_text = DESCRIPTION_TEXT
            val importance = NotificationManager.IMPORTANCE_HIGH
            val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
                description = description_text
            }
    
            val notificationManager: NotificationManager =
                getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(channel)
        }
    
    }
    fun alarmFajr(){
        alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager
        val i = Intent(this, fajrBroadcastReceiver::class.java)
    
        pendingIntent = PendingIntent.getBroadcast(this, 0, i,0)
    
        alarmManager.setInexactRepeating(
            AlarmManager.RTC_WAKEUP, calender.timeInMillis,
            AlarmManager.INTERVAL_DAY, pendingIntent
        )
    }

    >> نسخه من السؤال موجود في موقع Stack overflow

     استخدم جافا وكوتلن فقط

    • أعجبني 1
  17. بتاريخ 2 ساعات قال إسلام عبدالعزيز:

    أنت تقوم بكتابة الكود الخاص بعمل update للـ SeekBar بداخل:

    
    if (mediaPlayer == null) {
      // ...
    }

    في مرحلة الـ initialization، ستكون قيمة هذه الـ condition خاطئة.

    لذا، قم بكتابة الكود اللازم للتحكم في حفظ القيمة خارج الـ if condition.
     

    لا زالت المشكله نفسها.. 

  18. السلام عليكم انا لدي مشكلة لم أجد لها حلا الى هذه اللحظه. انا لدي تطبيق قرأني يعمل بنسخة pdf وملفات صوتيه داخل BottomSheet وكل شيء يعمل بشكل جيد لكن عندما أغلق الbottomsheet  الصوت يضل يعمل لكن القيمة الseekbar لا تعمل وتصل قيمتة الى النهايه وحتى الtextviews ترجع الى 0:00 كيف أحل هذه المشكلة بحيث عندما اغلف الbottomsheet يضل السيكبار والتيكست يعملان على الصوت؟

    هذا الكود

     private var mediaPlayer:MediaPlayer? = null
     private var oTime = 0
    private var sTime: Int = 0
    private var eTime: Int = 0
    
      fun quranMp3(){
    
     quranPlay?.setOnClickListener {
            // الفاتحة
    
            if (quranPageNum?.equals(0)!!){
    
                if (mediaPlayer == null){
                    mediaPlayer = MediaPlayer.create(context, Uri.parse("https://server7.mp3quran.net/basit/Almusshaf-Al-Mojawwad/001.mp3"))
                    Log.d("quranMp3", "ID: ${mediaPlayer!!.audioSessionId}")
    
                    val position = mediaPlayer!!.currentPosition/100
                    mp3SeekBar.progress = position
                    //totalTime = mediaPlayer!!.duration
    
                    eTime = mediaPlayer!!.duration.toLong().toInt()
                    sTime = mediaPlayer!!.currentPosition.toLong().toInt()
    
                    if (oTime == 0) {
                        quranSeekBar!!.setMax(eTime)
                        oTime = 1
                    }
    
                    playerDuration?.text = String.format(
                        "%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(eTime.toLong()),
                        TimeUnit.MILLISECONDS.toSeconds(eTime.toLong()) - TimeUnit.MINUTES.toSeconds(
                            TimeUnit.MILLISECONDS.toMinutes(eTime.toLong())))
    
                    playerPosition?.text = String.format(
                        "%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(sTime.toLong()),
                        TimeUnit.MILLISECONDS.toSeconds(sTime.toLong()) - TimeUnit.MINUTES.toSeconds(
                            TimeUnit.MILLISECONDS.toMinutes(sTime.toLong())))
    
    
    
    
    
                    initializeSeekBar()
    
    
    
                }
    
                mediaPlayer?.start()
                Log.d("QuranMp3", "Duration: ${mediaPlayer!!.duration/1000} seconds")
    
            }
    
       quranPause?.setOnClickListener {
    
            if (mediaPlayer !== null){
                mediaPlayer?.pause()
                Log.d("QuranMp3", "Paused at: ${mediaPlayer!!.duration/1000} seconds")
    
            }
    
    
    
     mp3SeekBar.setOnSeekBarChangeListener( object : SeekBar.OnSeekBarChangeListener{
    
                override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
    
    
                    if (fromUser){
                        mediaPlayer?.seekTo(progress)
    
                    }
                }
                override fun onStartTrackingTouch(seekBar: SeekBar?) {
                    val Toast = Toast.makeText(context,"تتبع..", Toast.LENGTH_LONG)
                    Toast.setGravity(Gravity.CENTER_VERTICAL, 50, 50)
                    Toast.show()
                }
                override fun onStopTrackingTouch(seekBar: SeekBar) {
                    val Toast = Toast.makeText(context,"يرجى الانتظار للحصول على البيانات..", Toast.LENGTH_LONG)
                    Toast.setGravity(Gravity.CENTER_VERTICAL, 50 ,50)
                    Toast.show()
    
    
                }
    
            })
    
     private fun initializeSeekBar() {
    
        val mp3SeekBar = view?.findViewById<SeekBar>(R.id.mp3SeekBar)
        mp3SeekBar?.max = mediaPlayer!!.duration
        val playerPosition = view?.findViewById<TextView>(R.id.player_position)
        val playerDuration =  view?.findViewById<TextView>(R.id.player_duraation)
    
        val seekbar = this.activity?.getSharedPreferences("QuranPdf", Context.MODE_PRIVATE)
    
    
        val handler = Handler()
        handler.postDelayed(object : Runnable {
    
            override fun run() {
    
    
                try {
    
                    sTime = mediaPlayer!!.currentPosition
    
                    playerDuration!!.text = String.format(
                        "%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(eTime.toLong()),
                        TimeUnit.MILLISECONDS.toSeconds(eTime.toLong()) - TimeUnit.MINUTES.toSeconds(
                            TimeUnit.MILLISECONDS.toMinutes(eTime.toLong())))
    
                    playerPosition?.text = String.format(
                        "%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(sTime.toLong()),
                        TimeUnit.MILLISECONDS.toSeconds(sTime.toLong()) - TimeUnit.MINUTES.toSeconds(
                            TimeUnit.MILLISECONDS.toMinutes(sTime.toLong())))
    
    
                    mp3SeekBar?.progress = sTime //mediaPlayer!!.currentPosition
                    handler.postDelayed(this, 1000)
    
                } catch (e: Exception) {
                    mp3SeekBar?.progress = 0
    
                }
            }
    
        }, 0)
    }

    هذه صور مشكلتي كما ترون عندما افتح الbottomsheet  كل شيء يعمل بشكل جيد لكن عندا اجعل الصوت يعمل وأغلق الbottomsheet لأقراء وأفتحة مجددا عندما أنهي القراءة السيكبار يصل الى النهايه والتيكست ترجع الى 0:00

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

    شكرا لكم واتمنى ان يتم حل مشكلتي

     

    320g7.jpg

    2OWoe.jpg

  19. السلام عليكم انا لدي مشكلة لم أجد لها حلا الى هذه اللحظه. انا لدي تطبيق قرأني يعمل بنسخة pdf وملفات صوتيه داخل BottomSheet وكل شيء يعمل بشكل جيد لكن عندما أغلق الbottomsheet  الصوت يضل يعمل لكن القيمة الseekbar لا تعمل وتصل قيمتة الى النهايه وحتى الtextviews ترجع الى 0:00 كيف أحل هذه المشكلة بحيث عندما اغلف الbottomsheet يضل السيكبار والتيكست يعملان على الصوت؟

    هذا الكود

     private var mediaPlayer:MediaPlayer? = null
     private var oTime = 0
    private var sTime: Int = 0
    private var eTime: Int = 0
    
      fun quranMp3(){
    
     quranPlay?.setOnClickListener {
            // الفاتحة
    
            if (quranPageNum?.equals(0)!!){
    
                if (mediaPlayer == null){
                    mediaPlayer = MediaPlayer.create(context, Uri.parse("https://server7.mp3quran.net/basit/Almusshaf-Al-Mojawwad/001.mp3"))
                    Log.d("quranMp3", "ID: ${mediaPlayer!!.audioSessionId}")
    
                    val position = mediaPlayer!!.currentPosition/100
                    mp3SeekBar.progress = position
                    //totalTime = mediaPlayer!!.duration
    
                    eTime = mediaPlayer!!.duration.toLong().toInt()
                    sTime = mediaPlayer!!.currentPosition.toLong().toInt()
    
                    if (oTime == 0) {
                        quranSeekBar!!.setMax(eTime)
                        oTime = 1
                    }
    
                    playerDuration?.text = String.format(
                        "%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(eTime.toLong()),
                        TimeUnit.MILLISECONDS.toSeconds(eTime.toLong()) - TimeUnit.MINUTES.toSeconds(
                            TimeUnit.MILLISECONDS.toMinutes(eTime.toLong())))
    
                    playerPosition?.text = String.format(
                        "%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(sTime.toLong()),
                        TimeUnit.MILLISECONDS.toSeconds(sTime.toLong()) - TimeUnit.MINUTES.toSeconds(
                            TimeUnit.MILLISECONDS.toMinutes(sTime.toLong())))
    
    
    
    
    
                    initializeSeekBar()
    
    
    
                }
    
                mediaPlayer?.start()
                Log.d("QuranMp3", "Duration: ${mediaPlayer!!.duration/1000} seconds")
    
            }
    
       quranPause?.setOnClickListener {
    
            if (mediaPlayer !== null){
                mediaPlayer?.pause()
                Log.d("QuranMp3", "Paused at: ${mediaPlayer!!.duration/1000} seconds")
    
            }
    
    
    
     mp3SeekBar.setOnSeekBarChangeListener( object : SeekBar.OnSeekBarChangeListener{
    
                override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
    
    
                    if (fromUser){
                        mediaPlayer?.seekTo(progress)
    
                    }
                }
                override fun onStartTrackingTouch(seekBar: SeekBar?) {
                    val Toast = Toast.makeText(context,"تتبع..", Toast.LENGTH_LONG)
                    Toast.setGravity(Gravity.CENTER_VERTICAL, 50, 50)
                    Toast.show()
                }
                override fun onStopTrackingTouch(seekBar: SeekBar) {
                    val Toast = Toast.makeText(context,"يرجى الانتظار للحصول على البيانات..", Toast.LENGTH_LONG)
                    Toast.setGravity(Gravity.CENTER_VERTICAL, 50 ,50)
                    Toast.show()
    
    
                }
    
            })
    
     private fun initializeSeekBar() {
    
        val mp3SeekBar = view?.findViewById<SeekBar>(R.id.mp3SeekBar)
        mp3SeekBar?.max = mediaPlayer!!.duration
        val playerPosition = view?.findViewById<TextView>(R.id.player_position)
        val playerDuration =  view?.findViewById<TextView>(R.id.player_duraation)
    
        val seekbar = this.activity?.getSharedPreferences("QuranPdf", Context.MODE_PRIVATE)
    
    
        val handler = Handler()
        handler.postDelayed(object : Runnable {
    
            override fun run() {
    
    
                try {
    
                    sTime = mediaPlayer!!.currentPosition
    
                    playerDuration!!.text = String.format(
                        "%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(eTime.toLong()),
                        TimeUnit.MILLISECONDS.toSeconds(eTime.toLong()) - TimeUnit.MINUTES.toSeconds(
                            TimeUnit.MILLISECONDS.toMinutes(eTime.toLong())))
    
                    playerPosition?.text = String.format(
                        "%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(sTime.toLong()),
                        TimeUnit.MILLISECONDS.toSeconds(sTime.toLong()) - TimeUnit.MINUTES.toSeconds(
                            TimeUnit.MILLISECONDS.toMinutes(sTime.toLong())))
    
    
                    mp3SeekBar?.progress = sTime //mediaPlayer!!.currentPosition
                    handler.postDelayed(this, 1000)
    
                } catch (e: Exception) {
                    mp3SeekBar?.progress = 0
    
                }
            }
    
        }, 0)
    }

    هذه صور مشكلتي كما ترون عندما افتح الbottomsheet  كل شيء يعمل بشكل جيد لكن عندا اجعل الصوت يعمل وأغلق الbottomsheet لأقراء وأفتحة مجددا عندما أنهي القراءة السيكبار يصل الى النهايه والتيكست ترجع الى 0:00

     

    شكرا لكم واتمنى ان تحلو مشكلتي

     

    320g7.jpg

    2OWoe.jpg

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

    انا اسنخدم هذا الكلاس  هنا

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

    هذا كود الصلوات

      val TimeId = TimezoneMapper.latLngToTimezoneString(location.latitude, location.longitude)
    
                        val gmt = TimeZone.getTimeZone(TimeId).getDisplayName(false, TimeZone.SHORT)
    
                        val z1 = gmt.substring(4)
                        val z = z1.replace(":", ".")
                        val zo = z.toDouble()
                        val latitude: Double = location.latitude
                        val longitude: Double = location.longitude
    
                        val locationPref = getSharedPreferences("location", Context.MODE_PRIVATE)
                        val editor = locationPref.edit()
                        //    editor.putFloat("lat", lat1.toFloat())
                        //   editor.putFloat("lng", lng.toFloat())
                        locationPref.edit().putDouble("latt1", latitude).apply()
                        locationPref.edit().putDouble("lngg2", longitude).apply()
    
                        editor.apply()
    
                        lat.text = "LAT:$latitude"
                        Long.text = "LONG:$longitude"
                        timeZone2.text = "TimeZone:$zo"
    
    
                        val timeZoneId = TimeZone.getAvailableIDs()
                        val prayTime = praytime()
                        prayTime.timeFormat = prayTime.time12 // getTime12 is protected
                        prayTime.calcMethod = prayTime.makkah // Makkah
                        prayTime.asrJuristic = prayTime.shafii // Shafii (standard)
                        prayTime.adjustHighLats = prayTime.angleBased
                        // my codes
                        prayTime.timeZone = prayTime.timeZone1
                        prayTime.setFajrAngle(18.5)
    
                        prayTime.computeMidDay(prayTime.dhuhrMinutes.toDouble())
                        val offsets = intArrayOf(
                            0,
                            0,
                            0,
                            0,
                            0,
                            0,
                            0
                        ) // {Fajr,Sunrise,Dhuhr,Asr,Sunset,Maghrib,Isha}
    
                        prayTime.tune(offsets)
                        val cal = Calendar.getInstance(TimeZone.getTimeZone(timeZoneId.toString()))
                        val now = Date()
                        cal.time = now
    
    
    
                        val times: ArrayList<String> =
                            prayTime.getPrayerTimes(
                                cal, latitude, longitude, zo
                            )
                        findViewById<TextView>(R.id.Fajr).text = times.get(0)
                        findViewById<TextView>(R.id.sabah).text = times.get(1)
                        findViewById<TextView>(R.id.dhuhr).text = times.get(2)
                        findViewById<TextView>(R.id.AzanTime).text = times.get(3)
                        findViewById<TextView>(R.id.maghreb).text = times.get(4)
                        findViewById<TextView>(R.id.Esha).text = times.get(6)

     

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

     val currentTime = Calendar.getInstance().time
                            val endDateDay = "6/09/2020 ${times[0]} "
                            val format1 = SimpleDateFormat("DD/MM/YY hh:mm",Locale.getDefault())
                            val endDate = format1.parse(endDateDay)
    
                            //milliseconds
                            var different = endDate.time - currentTime.time
                            countDownTimer = object : CountDownTimer(different, 1000) {
    
                                override fun onTick(millisUntilFinished: Long) {
                                    var diff = millisUntilFinished
                                    val secondsInMilli: Long = 1000
                                    val minutesInMilli = secondsInMilli * 60
                                    val hoursInMilli = minutesInMilli * 60
                                    val daysInMilli = hoursInMilli * 24
    
                                    val elapsedDays = diff / daysInMilli
                                    diff %= daysInMilli
    
                                    val elapsedHours = diff / hoursInMilli
                                    diff %= hoursInMilli
    
                                    val elapsedMinutes = diff / minutesInMilli
                                    diff %= minutesInMilli
    
                                    val elapsedSeconds = diff / secondsInMilli
    
                                    SalahCount.text = "$elapsedDays days $elapsedHours hs $elapsedMinutes min $elapsedSeconds sec"
                                }
    
                                override fun onFinish() {
                                    SalahCount.text = "done!"
                                }
                            }.start()

     

    وشكرا لكم

×
×
  • أضف...