آموزش برنامه نویسی اندروید (Android)
۴۱۹ آموزش
نمایش دسته بندی ها (۴۱۹ آموزش)

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

در این مبحث، قصد دارم که چگونگی ساخت جستجو در بین عنوان های برنامه اندروید را آموزش بدهم. مثلا فرض کنید که شما یک برنامه اندروید ساخته اید که دارای 200 قسمت می باشد و هر قسمت دارای یک عنوان خاص است، من به شما آموزش می دهم که چگونه یک صفحه مخصوص جستجو بسازید که ابتدا همه 200 قسمت را به صورت یک لیست نمایش بدهد و سپس، کاربر کلمات مورد نظر خود را وارد کند و آنگاه، در لیست، تنها عنوان هایی باقی بماند که کلمه مورد نظر کاربر، در آنها وجود دارد. کاربر با اشاره بر روی هر عنوان آموزشی، به صفحه مربوط به آن، هدایت خواهد شد.

کدها با این فرض نوشته شده اند که هیچ دو مبحثی، دارای عنوان برابر نیستند (داشتن عنوان برابر می تواند باعث باز شدن همزمان هر دو مبحث، هنگام اشاره کاربر بر روی نتایج شود. این مورد را به زودی تغییر خواهم داد تا کدها برای عنوان های برابر نیز مشکلی نداشته باشد، البته انتخاب عنوان برابر، زیاد جالب نیست ولی به هر حال، در آینده این مورد را نیز در نظر خواهم گرفت)

دسترسی به صفحه جستجو نیز به این صورت خواهد بود که در action bar ، یک عکس به شکل ذره بین قرار می دهیم و کاربر با اشاره بر روی آن، به صفحه جستجو هدایت می شود.

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید
آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

توصیه می کنم ابتدا فایل apk را که در آخر این آموزش قرار داده ایم، دانلود کرده و بر روی گوشی خود نصب کنید و با قسمت جستجوی آن کار کنید، اگر دقیقا همان چیزی بود که می خواهید، این آموزش را بخوانید.

در برنامه eclipse ، ابتدا یک پروژه اندروید با نام Kelidestan.com_Search می سازیم (نام package را برابر com.kelidestan.search انتخاب می کنیم. نام activity اصلی را برابر MainActivity انتخاب می کنیم و فایل xml متناظر آن را هم برابر activity_main قرار می دهیم).

برای این پروژه اندروید، به دو عکس نیاز داریم، یکی برای آیکون قسمت جستجو (به شکل ذره بین) و دیگری یک عکس پس زمینه که در پشت نتایج جستجو، نمایش داده می شود (برای زیباتر شدن این بخش). این دو عکس را می توانید از لینک زیر دانلود کنید تا در ادامه، از آنها استفاده نمایید :

بعد از اینکه پروژه ساخته شد، ابتدا فرض می کنیم که برنامه اندروید ما، قرار است که دارای 3 مبحث آموزشی باشد (این تعداد را به هر عدد دلخواه می توان افزایش داد، اما ما فعلا تعداد را برابر 3 قرار می دهیم تا روش کلی را توضیح بدهیم). بنابراین ما سه activity می سازیم، با نام های Subject_1 و Subject_2 و Subject_3 که هر کدام حاوی یک TextView است که در آن متنی دلخواه را می نویسیم (به عنوان محتوای آموزش) :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

هر آموزش، به صورت یک activity در نظر گرفته شده و هر activity هم، یک فایل xml را برای نمایش محتوای آموزشی، به کار می برد. دقت کنید که ممکن است برنامه شما به گونه ای طراحی شده باشد که مثلا برای نمایش 200 آموزش، تنها از یک activity و همچنین، تنها از یک فایل xml استفاده کرده باشید (این روش، روش برتر می باشد و تنها محتوا را با کدنویسی تغییر می دهند، در آینده، یک مبحث در این مورد خواهم نوشت)، در این صورت، باید روش کلی این آموزش را یاد بگیرید و تنها کدنویسی مربوط به قسمت رفتن به مباحث آموزشی (پس از انتخاب آنها در لیست نتایج جستجو) را تغییر بدهید.

خوب اکنون باید در activity اصلی، که همان صفحه اول برنامه اندروید می باشد، سه دکمه بسازیم که ما را به سه مبحث آموزش مورد نظر ببرند. بنابراین در فایل activity_main.xml که همان فایل xml متناظر برای activity اصلی می باشد، باید سه دکمه تعریف کنیم :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

ابتدا TextView درون این فایل را حذف می کنیم و سپس، سه دکمه را در آن قرار می دهیم :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

کدهای فایل activity_main.xml ، به صورت زیر خواهد بود :


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 2" />

    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 3" />

</LinearLayout>

اکنون فایل MainActivity.java که همان activity اصلی است را باز کرده و کدهای لازم برای آن سه دکمه را می نویسیم (تعریف activity هایی که با اشاره به دکمه ها، وارد آنها می شویم) :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

پس از باز کردن فایل MainActivity.java ، کدهای آن به صورت زیر می باشد :


package com.kelidestan.search;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

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

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }

}

کدها را به صورت زیر تغییر می دهیم :


package com.kelidestan.search;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
               
                Button b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener(new OnClickListener() {
               
                @Override
                public void onClick(View arg0) {
                        startActivity(new Intent(MainActivity.this, Subject_1.class));
                }
        });
       
        Button b2 = (Button) findViewById(R.id.button2);
        b2.setOnClickListener(new OnClickListener() {
               
                @Override
                public void onClick(View arg0) {
                        startActivity(new Intent(MainActivity.this, Subject_2.class));
                }
        });
       
        Button b3 = (Button) findViewById(R.id.button3);
        b3.setOnClickListener(new OnClickListener() {
               
                @Override
                public void onClick(View arg0) {
                        startActivity(new Intent(MainActivity.this, Subject_3.class));
                }
        });
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }

}

اکنون باید در فایل strings.xml ، عبارت های مربوط به مباحث را بنویسیم (عنوان های مباحث که قرار است در آنها جستجو کنیم). فایل strings.xml را باز می کنیم :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

در ابتدا، کدهای آن به صورت زیر می باشد :


<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Kelidestan.com_Search</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="title_activity_subject_1">Subject_1</string>
    <string name="title_activity_subject_2">Subject_2</string>
    <string name="title_activity_subject_3">Subject_3</string>
    <string name="title_activity_search">Search</string>

</resources>

خوب حالا باید عنوان های آموزش ها را تعریف کنیم و همچنین آنها را به شکلی مناسب برای قسمت جستجو تعریف کنیم. برای این منظور، کدهای زیر را می نویسیم :


<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Kelidestan.com_Search</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="title_activity_subject_1">Subject_1</string>
    <string name="title_activity_subject_2">Subject_2</string>
    <string name="title_activity_subject_3">Subject_3</string>
    <string name="title_activity_search">Search</string>
   
    <string name="subject_1">آموزش اول ( first )</string>
    <string name="subject_2">آموزش دوم ( second )</string>
    <string name="subject_3">آموزش سوم ( third )</string>
   
    <string-array name="search">
        <item>@string/subject_1</item>
        <item>@string/subject_2</item>
        <item>@string/subject_3</item>
    </string-array>
   
    <string name="search">جستجو</string>

</resources>

همان طور که مشاهده می کنید، سه رشته (string) برای سه عنوان آموزشی تعریف کرده ایم. همچنین یک string-array تعریف کرده ایم که در آن، به سه رشته مربوط به عنوان های آموزشی، ارجاع داده ایم (شما هم حتما ارجاع بدهید و نیازی نیست که دوباره هر عنوان را درون string-array بنویسید، زیرا بعدا در صورت تمایل برای تغییر یک عنوان، تنها کافی است که یک رشته را تغییر بدهید، نه دو رشته).

یک توصیه : بین کلمات و پرانتزها، فاصله قرار بدهید، زیرا چسبیدن کلمات به ابتدا یا انتهای پرانتز، می تواند باعث نمایش داده نشدن آن کلمات در نتایج جستجو شود. مثلا ما به جای عبارت (first)، عبارت ( first ) را نوشته ایم.

فایل subject_1.xml را باز کرده و کدهای آن را به صورت زیر می نویسیم :


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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"
    tools:context=".Subject_1" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="right"
        android:text="@string/subject_1" />

</RelativeLayout>

بنابراین نمایش گرافیکی آن به صورت زیر خواهد بود (به همریختگی حروف فارسی مهم نیست) :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

فایل subject_2.xml را باز کرده و کدهای آن را به صورت زیر می نویسیم :


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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"
    tools:context=".Subject_1" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="right"
        android:text="@string/subject_2" />

</RelativeLayout>

بنابراین نمایش گرافیکی آن به صورت زیر خواهد بود (به همریختگی حروف فارسی مهم نیست) :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

فایل subject_3.xml را باز کرده و کدهای آن را به صورت زیر می نویسیم :


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    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"
    tools:context=".Subject_1" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="right"
        android:text="@string/subject_3" />

</RelativeLayout>

بنابراین نمایش گرافیکی آن به صورت زیر خواهد بود (به همریختگی حروف فارسی مهم نیست) :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

بنابراین سه activity مربوط به سه عنوان آموزشی را ساختیم (به گونه ای که بتوانیم آنها را از یکدیگر تشخیص بدهیم).

اکنون باید یک activity برای قسمت جستجوی برنامه اندروید بسازیم، بنابراین یک activity با نام Search می سازیم (فایل Search.java و فایل xml متناظر آن هم با نام search.xml) :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

ابتدا به فایل search.xml می پردازیم. این فایل را باز کرده و سپس کدهای زیر را در آن می نویسیم :


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/search_background"
    android:orientation="vertical" >
     
    <!-- Editext for Search -->
    <EditText android:id="@+id/inputSearch"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="جستجو"
        android:inputType="textVisiblePassword"/>
 
    <!-- List View -->

    <ListView
        android:id="@+id/list_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
 
</LinearLayout>

دقت کنید که یک عکس با نام search_background را در فولدر drawable-hdpi کپی کرده ایم که در پس زمینه صفحه جستجو، نمایش داده می شود (برای زیباتر شدن این صفحه). بنابراین شکل گرافیکی فایل search.xml به صورت زیر خواهد بود :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

اکنون باید یک فایل با نام list_item.xml بسازیم :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

و کدهای آن را به صورت زیر می نویسیم :


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
     
    <!-- Single ListItem -->
     
    <!-- Subject Name -->
    <TextView android:id="@+id/subject_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:textSize="16dip"
        android:textStyle="bold"/>    
 
</LinearLayout>

حال، فایل Search.java را باز می کنیم، کدهای آن به صورت زیر می باشد :


package com.kelidestan.search;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class Search extends Activity {

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

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.search, menu);
                return true;
        }

}

کدهای آن را به صورت زیر تغییر می دهیم :


package com.kelidestan.search;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

public class Search extends Activity {
       
        // List view
    private ListView lv;
     
    // Listview Adapter
    ArrayAdapter<String> adapter;
     
    // Search EditText
    EditText inputSearch;
     
     
    // ArrayList for Listview
    ArrayList<HashMap<String, String>> productList;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.search);
               
                // Listview Data
        String products[] = getResources().getStringArray(R.array.search);
         
        lv = (ListView) findViewById(R.id.list_view);
        inputSearch = (EditText) findViewById(R.id.inputSearch);
         
        // Adding items to listview
        adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.subject_name, products);
        lv.setAdapter(adapter);
         
        /**
         * Enabling Search Filter
         * */

        inputSearch.addTextChangedListener(new TextWatcher() {
             
            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                // When user changed the Text
                Search.this.adapter.getFilter().filter(cs);  
            }
             
            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub
                 
            }
             
            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub                          
            }
        });
       
        // after click
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, final View view,
                int position, long id) {
                       
                final String item = lv.getItemAtPosition(position).toString();
                int total_number = 3;
                for(int x = 1; x < total_number+1; x = x+1) {
                        String SubjectName = "subject_" + String.valueOf(x);
                        int resID = getResources().getIdentifier(SubjectName, "string", getPackageName());
                        String subject = getResources().getString(resID);
                       
                        if(item.equals(subject)) {
                                String StringClass = "com.kelidestan.search.Subject_" + String.valueOf(x);
                                Class<?> c = null;
                                if(StringClass != null) {
                                    try {
                                        c = Class.forName(StringClass);
                                    } catch (ClassNotFoundException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                }
                                Intent intent = new Intent(Search.this, c);
                                startActivity(intent);
                        }
                }
               
            }

          });
        }
       
        @Override
        public void onResume() {
            super.onResume();
            adapter.notifyDataSetChanged();
        }

       

}

اگر تعداد مباحث برنامه اندروید شما، مثلا برابر 200 مبحث باشد، باید متغیر total_number در کدهای بالا را به جای 3 ، برابر 200 تعریف کنید (عدد 3 را باید به تعداد مبحث مورد نظر خود تغییر بدهید).

همچنین به این خط از کدها توجه کنید :


String StringClass = "com.kelidestan.search.Subject_" + String.valueOf(x);

خط بالا برای برنامه اندروید دارای package با نام com.kelidestan.search می باشد و اگر شما می خواهید از این کدها، برای برنامه اندروید خود استفاده کنید، باید نام package مورد نظر خود را در این خط بنویسید. دقت کنید که ما، پیشوند موضوعات را به صورت subject_ در نظر گرفتیم (که بعد از آن، شماره آموزش درج می شود)، بنابراین اگر پیشوند انتخابی شما فرق دارد، این پیشوند را نیز باید در این خط تغییر بدهید.

همه قسمت های برنامه را ساختیم، اما یک بخش مهم باقی مانده است و آن قرار دادن دکمه ای در action bar است که بتوانیم توسط آن، وارد صفحه جستجو بشویم. ابتدا یک عکس (که قرار است در action bar نمایش داده شود) را با نام search ، در فولدر drawable-hdpi از پروزه اندروید، کپی کنیم :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

سپس فایلی با نام menu.xml می سازیم (در مسیر نمایش داده شده در تصویر زیر) :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

کدهای فایل menu.xml را به صورت زیر می نویسیم :


<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/itemSearch"
        android:icon="@drawable/search"
        android:showAsAction="ifRoom|withText"
        android:title="@string/search">
    </item>
</menu>

خوب حالا برای اینکه در تمامی activity ها، در action bar ، آیکون مربوط به قسمت جستجو را داشته باشیم، باید فایل java مربوط به تک تک activity ها را باز کرده و onCreateOptionsMenu() و همچنین onOptionsItemSelected() را برای آن بنویسیم. ابتدا ببینید که آیا قبلا در activity ، کد مربوط به onCreateOptionsMenu() و onOptionsItemSelected() نوشته شده است یا خیر و اگر نوشته شده بود، باید آن را باز نویسی کنید. مثلا برای activity اصلی که فایل آن دارای نام MainActivity.java می باشد، کد زیر را می نویسیم :


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;
}
       
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.itemSearch:
        startActivity(new Intent(MainActivity.this, Search.class));
        return true;
    default:
        return true;
    }  
}

برای اینکه محل این کد را متوجه شوید، کدهای نهایی فایل MainActivity.java را در زیر نمایش داده ایم :


package com.kelidestan.search;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
               
                Button b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener(new OnClickListener() {
               
                @Override
                public void onClick(View arg0) {
                        startActivity(new Intent(MainActivity.this, Subject_1.class));
                }
        });
       
        Button b2 = (Button) findViewById(R.id.button2);
        b2.setOnClickListener(new OnClickListener() {
               
                @Override
                public void onClick(View arg0) {
                        startActivity(new Intent(MainActivity.this, Subject_2.class));
                }
        });
       
        Button b3 = (Button) findViewById(R.id.button3);
        b3.setOnClickListener(new OnClickListener() {
               
                @Override
                public void onClick(View arg0) {
                        startActivity(new Intent(MainActivity.this, Subject_3.class));
                }
        });
        }
       
        @Override
          public boolean onCreateOptionsMenu(Menu menu) {
                        MenuInflater inflater = getMenuInflater();
                    inflater.inflate(R.menu.menu, menu);
                    return true;
        }
       
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case R.id.itemSearch:
                        startActivity(new Intent(MainActivity.this, Search.class));
                        return true;
                default:
                        return true;
                }      
        }

}

فایل Subject_1.java را باز کرده و کدهای مربوط به onCreateOptionsMenu() و همچنین onOptionsItemSelected() را در آن می نویسیم، بنابراین کدهای نهایی این فایل، به صورت زیر خواهد بود :


package com.kelidestan.search;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

public class Subject_1 extends Activity {

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

        @Override
          public boolean onCreateOptionsMenu(Menu menu) {
                        MenuInflater inflater = getMenuInflater();
                    inflater.inflate(R.menu.menu, menu);
                    return true;
        }
       
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case R.id.itemSearch:
                        startActivity(new Intent(Subject_1.this, Search.class));
                        return true;
                default:
                        return true;
                }      
        }

}

فایل Subject_2.java را باز کرده و کدهای مربوط به onCreateOptionsMenu() و همچنین onOptionsItemSelected() را در آن می نویسیم، بنابراین کدهای نهایی این فایل، به صورت زیر خواهد بود :


package com.kelidestan.search;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

public class Subject_2 extends Activity {

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

        @Override
          public boolean onCreateOptionsMenu(Menu menu) {
                        MenuInflater inflater = getMenuInflater();
                    inflater.inflate(R.menu.menu, menu);
                    return true;
        }
       
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case R.id.itemSearch:
                        startActivity(new Intent(Subject_2.this, Search.class));
                        return true;
                default:
                        return true;
                }      
        }

}

فایل Subject_3.java را باز کرده و کدهای مربوط به onCreateOptionsMenu() و همچنین onOptionsItemSelected() را در آن می نویسیم، بنابراین کدهای نهایی این فایل، به صورت زیر خواهد بود :


package com.kelidestan.search;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;

public class Subject_3 extends Activity {

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

        @Override
          public boolean onCreateOptionsMenu(Menu menu) {
                        MenuInflater inflater = getMenuInflater();
                    inflater.inflate(R.menu.menu, menu);
                    return true;
        }
       
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case R.id.itemSearch:
                        startActivity(new Intent(Subject_3.this, Search.class));
                        return true;
                default:
                        return true;
                }      
        }

}

فایل Search.java را باز کرده و کدهای مربوط به onCreateOptionsMenu() و همچنین onOptionsItemSelected() را در آن می نویسیم، بنابراین کدهای نهایی این فایل، به صورت زیر خواهد بود :


package com.kelidestan.search;

import java.util.ArrayList;
import java.util.HashMap;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

public class Search extends Activity {
       
        // List view
    private ListView lv;
     
    // Listview Adapter
    ArrayAdapter<String> adapter;
     
    // Search EditText
    EditText inputSearch;
     
     
    // ArrayList for Listview
    ArrayList<HashMap<String, String>> productList;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.search);
               
                // Listview Data
        String products[] = getResources().getStringArray(R.array.search);
         
        lv = (ListView) findViewById(R.id.list_view);
        inputSearch = (EditText) findViewById(R.id.inputSearch);
         
        // Adding items to listview
        adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.subject_name, products);
        lv.setAdapter(adapter);
         
        /**
         * Enabling Search Filter
         * */

        inputSearch.addTextChangedListener(new TextWatcher() {
             
            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                // When user changed the Text
                Search.this.adapter.getFilter().filter(cs);  
            }
             
            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub
                 
            }
             
            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub                          
            }
        });
       
        // after click
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, final View view,
                int position, long id) {
                       
                final String item = lv.getItemAtPosition(position).toString();
                int total_number = 3;
                for(int x = 1; x < total_number+1; x = x+1) {
                        String SubjectName = "subject_" + String.valueOf(x);
                        int resID = getResources().getIdentifier(SubjectName, "string", getPackageName());
                        String subject = getResources().getString(resID);
                       
                        if(item.equals(subject)) {
                                String StringClass = "com.kelidestan.search.Subject_" + String.valueOf(x);
                                Class<?> c = null;
                                if(StringClass != null) {
                                    try {
                                        c = Class.forName(StringClass);
                                    } catch (ClassNotFoundException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                }
                                Intent intent = new Intent(Search.this, c);
                                startActivity(intent);
                        }
                }
               
            }

          });
        }
       
        @Override
        public void onResume() {
            super.onResume();
            adapter.notifyDataSetChanged();
        }
       
        @Override
          public boolean onCreateOptionsMenu(Menu menu) {
                        MenuInflater inflater = getMenuInflater();
                    inflater.inflate(R.menu.menu, menu);
                    return true;
        }
       
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case R.id.itemSearch:
                        startActivity(new Intent(Search.this, Search.class));
                        return true;
                default:
                        return true;
                }      
        }


}

خوب، ساخت پروژه اندروید تمام شد و اکنون می توانید آن را با روش دلخواه خود، تست کنید. من برنامه اندروید را بر روی گوشی نصب می کنم، صفحه اول برنامه به صورت زیر می باشد :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

بر روی آیکون به شکل ذره بین، در action bar کلیک می کنیم تا صفحه جستجو باز شود :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

حالا عبارت ((آموزش اول)) را می نویسیم و مشاهده می کنیم که تنها مبحث دارای این عنوان، در لیست باقی می ماند (اگر بر روی گزینه کلیک کنیم، به صفحه آن منتقل می شویم) :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

جستجو را برای کلمات انگلیسی نیز تست می کنیم، برای این منظور، حرف f را می نویسیم که باعث می شود تنها مبحثی که کلمه first در آن به کار رفته، در لیست باقی بماند (باز هم تذکر می دهم که هنگام تعریف عنوان ها، کلمات را به علامت های پرانتز نچسبانید و فاصله بین آنها قرار دهید) :

آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید

این مبحث، آموزشی بود برای ساخت جستجو برای برنامه اندروید، شما می توانید از آن استفاده کرده و ویژگی های مورد نظر خود (مثل رنگ متن نتایج جستجو، پس زمینه، محل آیکون جستجو و ...) را به دلخواه خود تغییر بدهید.

فایل های پروژه اندروید را می توانید از لینک های زیر دریافت کنید :

توضیحات بیشتر در مورد کدها :

در ادامه به چند نکته در مورد کدها اشاره خواهیم کرد.

نکته

به بخش زیر از کدهای فایل Search.java توجه کنید :


String products[] = getResources().getStringArray(R.array.search);

همان طور که مشاهده می کنید، آرایه ای از رشته ها (string) با نام products ساخته ایم. عملیات جستجو، درون عناصر این آرایه صورت می گیرد. شیوه ای که من برای قرار دادن متن ها (عنوان ها) به کار بردم، ابتدا تعریف عنوان ها در آرایه ای در فایل strings.xml و سپس قرار دادن آن در آرایه products می باشد. شما می توانید آرایه products را به هر شیوه دلخواه تعریف کنید. مثلا می توانید متن های مختلف را از یک سری فایل متنی فراخوانی کرده و سپس در عناصر مختلف آرایه products قرار بدهید تا جستجو در بین آن متن ها صورت گیرد. بنابراین تنها تعریف آرایه رشته ای products مهم است و شیوه این کار، بستگی به ساختار برنامه اندروید شما دارد.

نکته

به بخش زیر از کدهای فایل Search.java توجه کنید :


// after click
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, final View view,
                        int position, long id) {
                         
    final String item = lv.getItemAtPosition(position).toString();
    int total_number = 3;
    for(int x = 1; x < total_number+1; x = x+1) {
        String SubjectName = "subject_" + String.valueOf(x);
        int resID = getResources().getIdentifier(SubjectName, "string", getPackageName());
        String subject = getResources().getString(resID);
                         
        if(item.equals(subject)) {
            String StringClass = "com.kelidestan.search.Subject_" + String.valueOf(x);
            Class<?> c = null;
            if(StringClass != null) {
                try {
                    c = Class.forName(StringClass);
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            Intent intent = new Intent(Search.this, c);
            startActivity(intent);
        }
    }
                 
}

});
}

این بخش از کدها، تعیین کرده است که اگر کاربر بر روی یکی از نتایج جستجو اشاره کرد، چه اتفاقی بیفتد. این بخش نیز باید برای ساختارهای مختلف، به طور متفاوت تعریف شود و کدنویسی آن کاملا وابسته به ساختار برنامه اندروید می باشد.

نویسنده علیرضا گلمکانی
شماره کلید 251
گزینه ها
به اشتراک گذاری (Share) در شبکه های اجتماعی
نظرات 20 20 0
Naqib Shayea
۱۳۹۵/۰۵/۱۸
۱۷:۳۱

میشه یه آموزش برای جستجو دیتابیس آنلاین یا MYSQL بسازین که مثلا از گوشی یه متن رو بفرستین و بعد بر اساس اون یک سری داده از سرور بگیرین

admin
۱۳۹۵/۰۵/۲۵
۰۹:۲۸

سلام.
دریافت یک سری داده از صفحات PHP موجود در سرور اینترنتی را در مباحث زیر شرح داده ایم :





بنابراین تنها می ماند اینکه چگونه در صفجه PHP ، نتایج جستجو از پایگاه داده MySQL را دریافت و در خروجی نمایش بدهیم (برگردانیم). شما عبارت جستجو را به صفحه PHP می فرستید و در آن، یک query برای جدول (table) شامل اطلاعات اجرا خواهد شد که در آن query ، باید کلمه LIKE را به کار ببرید (برای یافتن تمامی ردیف های از جدول که آن عبارت در آنها وجود دارد). سپس نتایج برگردانده شده از پایگاه داده را به شکل json در خروجی صفحه PHP برمی گردانید تا برنامه اندروید بتواند بر اساس آن مباحثی که ذکر شد، اطلاعات را دریافت نموده و در یک ListView (یا RecyclerView) نمایش بدهد.
خروجی صفحه PHP را می توانید توسط یک صفحه HTML شامل تگ form ، در مرورگر اینترنت خود چک کنید (تا از صحت خروجی آن اطمینان پیدا کنید).

مسلم
۱۳۹۵/۰۸/۱۵
۱۳:۰۰

سلام،من قابلیت جستجو رو با لیست علاقه مندی ها ادغام کردم.درست هم کار میکنه مثلا یست رو نمایش میده و با کلیک روی هر کدوم از آیتم ها به بخش مورد نظر منتقل میشه.اما یه اشکال داره اونم اینه که اگه کلمه ای رو وارد کنم به بخش مورد نظر میتونم برم ولی اگه بعد از کلمه فاصله بزارم همش روی مبحث شماره یک میمونه،اگه کلمه مورد نظرم هم قبلش فاصله باشه بازم همین اتفاق پیش میوفته.رشته ام برقه و بصورت مبتدی شروع کردم لطفا توضیح بدید ممنونم

hossein2506
۱۳۹۵/۰۹/۲۷
۱۳:۵۴

با سلام کد قسمتی که بر روی ایتم های که سرچ میشود کلیک می کنیم و به صفحه دیگر منتقل میشویم کجاست؟

admin
۱۳۹۵/۱۰/۰۱
۰۶:۴۵

سلام.
بخش زیر از کدها :



meysamahmadi953
۱۳۹۵/۱۰/۲۶
۱۱:۰۵

سلام
ی مشکل دارم همین کدهارو  میزنم تو برنامم اما در جستجو فارسی تایپ میکنم خودش عدد تایپ میکنه    چرا؟؟؟ میشه کمکم کنید؟
هیچجای دیگه نتونستم کدی واسه جستجو پیدا کنم

soma90
۱۳۹۶/۰۹/۰۵
۲۱:۰۲

سلام.منم این مشکل رو دارم.وقتی فارسی تایپ میکنم بهم عدد میده.تازه یه مشکل دیگه هم هست تو آیتم که کلیک میکنم وارد اکتیویتی نمیشه(البته سرچ من تو منوس ناویگیشن دراوره)لطفا یه نفر راهنمایم کنه

حسن
۱۳۹۵/۱۱/۱۱
۱۸:۳۵

سلام ممنون میشم کمک کنید
من تو برنامه ام دو تا string دارم که هر کدوم از یه اکتیوتی دیگه اومدن مثلا زیر
private static String[] str = ListFehha.fehstha;
private static String[] str1 = KhetEntegal.list_fasll;
چطوری میشه با هم تو لیست سرچ اوردش .یا چجوری تو arrayAdapter با هم استفادشون کنم یا اینکه میشه با هم تبدیل به یک string کنم

rezaA
۱۳۹۵/۱۱/۲۶
۱۷:۴۸

سلام 
من ی برنامه کپی و مخاطب نوشتم
حالا می خوام امکان جسنجو در مخاطبین رو اضافه کنم 
نمیتونم این کارو بکنم (ینی جستجو در بین مخاطبین)
میشه کمک کنین

Tamkade@rayana.ir
۱۳۹۷/۰۶/۲۰
۰۱:۰۷

برنامتوبا چی نوشتی؟

مسعود
۱۳۹۷/۱۱/۰۶
۲۱:۲۵

سلام واسه سرچ بین مثلا 200 موضوع که به صورت استرینگ هستش چیکار باید کرد چطور میشه رویداد  بع از کیک شدن رو براشون ست کرد

رضا
۱۳۹۷/۱۱/۲۰
۲۱:۴۰

سلام 
باید چکارش کنم که رو هر کدوم از ایتم ها که بزنم بره به اکتیویتی دیگه
لطفا کمک کنید
ممنون میشم

نوید
۱۳۹۷/۱۱/۲۳
۰۸:۲۱

رضا
۱۳۹۷/۱۱/۲۵
۲۱:۳۴

ممنون داداش
موفق باشید

navidshk55
۱۳۹۷/۱۲/۲۱
۱۴:۱۶

خواهش میکنم عزیز بدردت خورد یانه؟؟

نوید
۱۳۹۷/۱۱/۲۳
۰۸:۱۶

سلام من طبق آموزش قبلیتون با لیست ویو لیست علاقه مندیهامو ساختم و طبق آموزش لیست جستجو رو هم ساختم ولی تو قسمت جستجو شما از لیست ویوو استفاده نکردین به همین دلیل جستجوی من همه چیزش درسته فقط قسمت مورد نظرمو که جستجو کرد وقتی روش کلیک میکنم که واردش بشم برنامه فورس کلوز میشه لطفا راهنمایم کنید ممنون

نوید
۱۳۹۷/۱۲/۱۹
۲۳:۵۵

سلام منگ همین مشکل شمارو دارم لطفا اگه جوابی براش پیدا کردین برا منم توضیح بدین که مشکلمو حل کنم ممنون به ایمیلم بفرستید اگه راه حلی پیدا کردین متشکرم
navidshk88@gmail.com

نوید
۱۳۹۷/۱۲/۱۹
۲۳:۴۸

سلام من طبق آموزش قبلیتون یه لیست ویو ساختم و صفحه علاقه مندیها که دراونجا ازکلاس گلوبال استفاده شده بود و شما آموزش قسمت جستجورو توی لیست ویو توضیح ندادین و برای هرمبحث یک اکتیویتی اختصاص دادین من قسمت جستجو رو ساختم قسمت فیلتر کارمیکنه ولی چون کد قسمت کلیکش برای لیست ویو نیست من به مشکل خوردم میشه کدقسمت کلیک روی آیتمهارو باتوجه به لیست ویو به ایمیلم ارسال کنید ممنونتون میشم اگه اینکاروبرام انجام بدین خودم خیلی تلاش کردم ولی بی نتیجه بود آخه من تازه کارم

navidshk55
۱۳۹۷/۱۲/۲۱
۱۴:۲۲

سلام میگم اینجا کسی جواب نمیده چرا؟؟؟

navidshk55
۱۳۹۸/۰۱/۰۳
۰۱:۵۸

دوستان خواهشا هرکی کدومتون میتونین کمکم کنین ممنون

ارسال نظر جدید (بدون نیاز به عضو بودن در وب سایت)