<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امیر حسین باقری</title>
        <link>https://virgool.io/feed/@amirahbg</link>
        <description>برنامه نویس اندروید</description>
        <language>fa</language>
        <pubDate>2026-06-17 08:10:11</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/37288/avatar/xLoScv.png?height=120&amp;width=120</url>
            <title>امیر حسین باقری</title>
            <link>https://virgool.io/@amirahbg</link>
        </image>

                    <item>
                <title>دیتا بایندینگ: اضافه کردن متغییر به xml (قسمت دوم)</title>
                <link>https://virgool.io/bistoon/%D8%AF%DB%8C%D8%AA%D8%A7-%D8%A8%D8%A7%DB%8C%D9%86%D8%AF%DB%8C%D9%86%DA%AF-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%D9%85%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D8%A8%D9%87-xml-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-zir66lwavzcx</link>
                <description>در قسمت قبل مقدمه ای از کتابخانه دیتا بایندینگ  را ارائه کردیم و در مثالی نشان دادیم چگونه میتوان یه سری کد های خسته کننده که همواره در کدهایمان تکرار می شوند(که به اصطلاح به آنها بویلرپلیت کد گفته می شود)، مانند findViewById را از کدهایمان حذف کنیم. در این بخش میخواهیم بویلرپلیت کدهای بیشتری را از کدهایمان حذف کنیم. فرض کنید می خواهید اطلاعات کاربر را نمایش دهید. باتوجه به مقاله قسمت قبل لیوت زیر را می سازیم.user_info.xml
&lt;?xml version=&amp;quot1.0&amp;quot encoding=&amp;quotutf-8&amp;quot?&gt;
&lt;layout xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot&gt;
    &lt;LinearLayout
            android:orientation=&amp;quotvertical&amp;quot
            android:layout_width=&amp;quotmatch_parent&amp;quot
            android:layout_height=&amp;quotmatch_parent&amp;quot&gt;
        &lt;ImageView
                android:id=&amp;quot@+id/userImage&amp;quot
                android:layout_width=&amp;quotwrap_content&amp;quot
                android:layout_height=&amp;quotwrap_content&amp;quot/&gt;
        &lt;TextView
                android:id=&amp;quot@+id/userFirstName&amp;quot
                android:layout_width=&amp;quotwrap_content&amp;quot
                android:layout_height=&amp;quotwrap_content&amp;quot/&gt;

        &lt;TextView
                android:id=&amp;quot@+id/userLastName&amp;quot
                android:layout_width=&amp;quotwrap_content&amp;quot
                android:layout_height=&amp;quotwrap_content&amp;quot/&gt;
    &lt;/LinearLayout&gt;
&lt;/layout&gt;و سپس داده ها را به این شکل به ویو میدهیمprivate void setUser(User user, ViewGroup root) {
    UserInfoBinding binding = UserInfoBinding.inflate(getLayoutInflater(), root, true);
    binding.userFirstName.setText(user.firstName);
    binding.userLastName.setText(user.lastName);
    binding.userImage.setImageBitmap(user.image);
}با اینکه کدهای بالا خیلی از کدهایی که با findViewById نوشته شده اند بهتر است اما هنوز بویلرپلیت کدهایی در آن یافت می شود که میتوان آنها را از کدحذف کرد.کتابخانه دیتا بایندیگ راه حل ساده ای را در اختیارمان گذاشته است. میتوانیم در کدهای xml متغییری به نام user تعریف کنیم و در کدهای xml ویو ها را مقدار دهی کنیم. برای اینکار باید تگ data و variable را به شکل زیر به لیوت اضافه کنید.&lt;?xml version=&amp;quot1.0&amp;quot encoding=&amp;quotutf-8&amp;quot?&gt;
&lt;layout xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot&gt;
    &lt;data&gt;
 &lt;variable
 name=&amp;quotuser&amp;quot
 type=&amp;quotcom.example.myapp.model.User&amp;quot/&gt;
    &lt;/data&gt;
    &lt;LinearLayout
            android:orientation=&amp;quotvertical&amp;quot
            android:layout_width=&amp;quotmatch_parent&amp;quot
            android:layout_height=&amp;quotmatch_parent&amp;quot&gt;
        &lt;ImageView
                android:src=&amp;quot@{user.image}&amp;quot
                android:layout_width=&amp;quotwrap_content&amp;quot
                android:layout_height=&amp;quotwrap_content&amp;quot/&gt;
        &lt;TextView
                android:text=&amp;quot@{user.firstName}&amp;quot
                android:layout_width=&amp;quotwrap_content&amp;quot
                android:layout_height=&amp;quotwrap_content&amp;quot/&gt;

        &lt;TextView
                android:text=&amp;quot@{user.lastName}&amp;quot
                android:layout_width=&amp;quotwrap_content&amp;quot
                android:layout_height=&amp;quotwrap_content&amp;quot/&gt;
    &lt;/LinearLayout&gt;
&lt;/layout&gt;برای ست کردن داده های ویو باید کدهای مربوط به دیتا بایندینگ را درون “@{…}” قرار دهید. برای مثال در کد بالا داریم  android:text=&amp;quot@{user.firstName}&amp;quotتا اینجای کار لیوت ما می داند چطور اطلاعاتی که در متغییر user هست را به ویوها دهد. اما ما هنوز متغییر user را مقدار دهی نکردیم. برای مقدار دهی user داریمprivate void setUser(User user, ViewGroup root) {
    UserInfoBinding binding = UserInfoBinding.inflate(getLayoutInflater(), root, true);
    binding.setUser(user);
}به همین راحتی!!!در این بخش دیدیم که چگونه میتوان متغییر را به xml اضافه کرد و بویلرپلیت ها را کم کرد. ویژگی های جالبتر و کاربردی تری از کتابخانه دیتا بایندینگ ناگفته مانده است که در سری آموزش معماری mvvm بررسی خواهد شد. لایک و سابسکرایب فراموش نشه. اگر هم سوالی داشتید تو کامنتا برسید! ممنون از همتون</description>
                <category>امیر حسین باقری</category>
                <author>امیر حسین باقری</author>
                <pubDate>Wed, 06 Nov 2019 12:10:42 +0330</pubDate>
            </item>
                    <item>
                <title>دیتا بایندینگ: خداحافظ findViewById(قسمت اول)</title>
                <link>https://virgool.io/bistoon/databinding1-fqgorg0fgqyi</link>
                <description>دیتا بایندینگ یکی از کتابخانه های شناخته شده اندروید می باشد که توسط گوگل پیاده سازی شده است. این کتابخانه بسیار کاربردی بوده و ویژگی های جذاب دارد که در این مقاله و مقاله بعدی به بررسی آنها میپردازیم. ابتدا کتابخانه دیتا بایندیگ را به پروژه اضافه میکنیم. برای این کار کافیست کد زیر را به gradle برنامه اضافه کنیم.android {
    ...
    dataBinding {
        enabled true
    }
}در مرحله بعد باید فایل xml لیوتی که میخواهیم نمایش دهیم را تغییر بدیم. تگ  layout را به لیوت اضافه میکنیم(به عنوان تک پدر). به مثال زیر توجه کنید.&lt;layout xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot
    xmlns:app=&amp;quothttp://schemas.android.com/apk/res-auto&amp;quot
    xmlns:tools=&amp;quothttp://schemas.android.com/tools&amp;quot&gt;
    &lt;androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width=&amp;quotmatch_parent&amp;quot
        android:layout_height=&amp;quotmatch_parent&amp;quot
        tools:context=&amp;quot.MainActivity&amp;quot&gt;

        &lt;TextView
            android:id=&amp;quot@+id/hello&amp;quot
            android:layout_width=&amp;quotwrap_content&amp;quot
            android:layout_height=&amp;quotwrap_content&amp;quot
            android:text=&amp;quotHello World!&amp;quot
            app:layout_constraintBottom_toBottomOf=&amp;quotparent&amp;quot
            app:layout_constraintLeft_toLeftOf=&amp;quotparent&amp;quot
            app:layout_constraintRight_toRightOf=&amp;quotparent&amp;quot
            app:layout_constraintTop_toTopOf=&amp;quotparent&amp;quot /&gt;

    &lt;/androidx.constraintlayout.widget.ConstraintLayout&gt;
&lt;/layout&gt;حال باید کدهایمان را تغییر داده و به جای findViewById از دیتابایندینگ استفاده کنیم. چطور این کار را انجام بدیم؟ به جای این کد @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView hello = findViewById(R.id.hello);
    hello.setText(&amp;quotHello World!&amp;quot);
}می نویسیم@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
    binding.hello.setText(&amp;quotHello World!&amp;quot);
}اگر از fragment استفاده می کنید میتوانید از روش زیر به ویو ها دسترسی پیدا کنیدبه جای این کد @Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
                         @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_home, container, false);
    TextView hello = view.findViewById(R.id.hello);
    hello.setText(&amp;quotHello World!&amp;quot);
    return view.getRootView();
}می نویسیم@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
                         @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    FragmentHomeBinding binding = DataBindingUtil.inflate(
         inflater, R.layout.fragment_home, container, false);
    binding.hello.setText(&amp;quotHello World!&amp;quot);
    return binding.getRoot();
}به جای کد بالا میتوان از کد ساده تر زیر نیز استفاده کرد.@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
                         @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    FragmentHomeBinding binding = FragmentHomeBinding.inflate(inflater, container, false);
    binding.hello.setText(&amp;quotHello World!&amp;quot);
    return binding.getRoot();
}فرض کنید در یک صفحه، ۲۰ عدد ویو داشتیم، که فرض دور از واقعیت هم نیست. در این صورت در حالت قبل مجبور بودیم بیست خط findViewById بنویسیم، که با کمک کتابخانه دیتابایندینگ دیگر لازم نیست آن ها را بنویسیم. این ویژگی گفته شده، یکی از ابتدایی ترین مزیت های دیتابایندیگ می باشد. دیتابایندینگ، مزیت های پیچیده و کاربردی تر دیگری هم دارد که به وسیله آن میتوان در xml متغییر تعریف کنیم و به صورت داینامیک ui را تغییر دهیم. از این مزیت در معماری mvvm به کررات استفاده می شود. در مقاله بعدی به بررسی این ویژگی ها میپردازیم.لایک و سابسکرایب فراموش نشه. اگر هم سوالی داشتید تو کامنتا برسید! ممنون از همتون</description>
                <category>امیر حسین باقری</category>
                <author>امیر حسین باقری</author>
                <pubDate>Tue, 05 Nov 2019 23:58:41 +0330</pubDate>
            </item>
                    <item>
                <title>معماری MVVM و تفاوت آن با MVP؟ بخش اول</title>
                <link>https://virgool.io/bistoon/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-mvvm-%D9%88-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A2%D9%86-%D8%A8%D8%A7-mvp-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-gw3t6dlssepk</link>
                <description>معماری MVVM یا همون Model-View-Viewmodel همانند mvc یا mvp یکی از الگو های معماری نرم افزار است. استفاده از آن به ما کمک میکند کدی تمیز، قابل نگهداری ، قابل تست و با خوانایی بالا داشته باشیم. برای فهم کامل این سری از مقاله ها لازم است با معماری MVP آشنایی داشته باشید. همچنین سطح متوسط به بالا در برنامه نویسی اندروید هم لازم است. به طور کلی MVVM از سه بخش تشکیل شدهویو(view): وظیفه نمایش اطلاعات و گرفتن داده های ورودی از کاربر را دارد. اطلاعات گرفته شده از کاربر به viewmodel فرستاده می شود. ویومدل(viewmodel): داده های دریافت شده از مدل را مدریت می کند و به view می فرستد.مدل(model): وظیفه مدیریت داده ها را بر عهده دارد.در نگاه اول، به نظر می رسد شباهت بسیار زیادی بین معماری MVP و MVVM وجود دارد. انگار presenter به viewmodel تبدیل شده است. اما تفاوت آنها چیزی فراتر از تغییر نام presenter به viewmodel است. همانطور که در شکل زیر می بینید یک سری اینترفیس هم برای پیاده سازی MVP لازم است. اینترفیس IView بعد ها در presenter استفاده می شود و به طور مستقیم view را تغییر می دهد.  در صورتی که در معماری MVVM این اتفاق به طور مستقیم نمی افتد یعنی viewmodel به صورت غیر مستقیم view را تغییر می دهد. نکته دیگر این است که ارتباط بین view و presenter در mvp یک به یک است، اما ارتباط بین view و viewmodel یک به چند است.معماری MVPمعماری MVVMاینکه در معماری MVP ، ویو به صورت مستقیم توسط presenter تغییر میکند یک سری مشکلات و پیچیدگی ها را به کد اضافه می کند. زیرا ما مجبوریم حواسمان باشد که ویو در چه وضعیتی قرار دارد و اگر در وضعیت  یا onDestroy نبود اجازه به روز رسانی ویو را داریم. به همین دلیل ما مجبوریم در presenter وضعیت view را گزارش دهیم. همین باعث می شود تست کردن کد ها، نگهداری و پیچیدگی کدمان افزایش یابد. اما در معماری MVVM دیگر این مشکل وجود ندارد، چرا که دیگر viewmodel به طور مستقیم با view در ارتباط نیست. شاید برایتان سوال باشد که اگر viewmodel با view در ارتباط نیست پس چگونه view را به روز رسانی می کند؟!چند راه حل برای به روز رسانی view توسط viewmodel پیشنهاد می شود. دیتا بایندینگ(DataBinding)لایو دیتا (LiveData)ار ایکس جاوا(RxJava)در همه راه حل های پیشنهاد شده هدف این است که یه سری observable (شی هایی هستند که زمانی که تغییر می کنند تغییرشان را به کسانی که آنها را observe (مشاهده) می کنند اعلام میکنند.) در viewmodel داشته باشیم که در view  آنها را observe(مشاهده) کنیم. در آموزش های بعدی به بررسی راه حل های موجود می پردازیم.</description>
                <category>امیر حسین باقری</category>
                <author>امیر حسین باقری</author>
                <pubDate>Fri, 20 Sep 2019 19:43:05 +0430</pubDate>
            </item>
            </channel>
</rss>