آموزش ساخت قسمت جستجو در عنوان های مباحث، برای برنامه اندروید
در این مبحث، قصد دارم که چگونگی ساخت جستجو در بین عنوان های برنامه اندروید را آموزش بدهم. مثلا فرض کنید که شما یک برنامه اندروید ساخته اید که دارای 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 ، به صورت زیر خواهد بود :
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 ، کدهای آن به صورت زیر می باشد :
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;
}
}
کدها را به صورت زیر تغییر می دهیم :
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 را باز می کنیم :
در ابتدا، کدهای آن به صورت زیر می باشد :
<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>
خوب حالا باید عنوان های آموزش ها را تعریف کنیم و همچنین آنها را به شکلی مناسب برای قسمت جستجو تعریف کنیم. برای این منظور، کدهای زیر را می نویسیم :
<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 را باز کرده و کدهای آن را به صورت زیر می نویسیم :
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 را باز کرده و کدهای آن را به صورت زیر می نویسیم :
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 را باز کرده و کدهای آن را به صورت زیر می نویسیم :
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 می پردازیم. این فایل را باز کرده و سپس کدهای زیر را در آن می نویسیم :
<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 بسازیم :
و کدهای آن را به صورت زیر می نویسیم :
<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 را باز می کنیم، کدهای آن به صورت زیر می باشد :
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;
}
}
کدهای آن را به صورت زیر تغییر می دهیم :
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 را باید به تعداد مبحث مورد نظر خود تغییر بدهید).
همچنین به این خط از کدها توجه کنید :
خط بالا برای برنامه اندروید دارای package با نام com.kelidestan.search می باشد و اگر شما می خواهید از این کدها، برای برنامه اندروید خود استفاده کنید، باید نام package مورد نظر خود را در این خط بنویسید. دقت کنید که ما، پیشوند موضوعات را به صورت subject_ در نظر گرفتیم (که بعد از آن، شماره آموزش درج می شود)، بنابراین اگر پیشوند انتخابی شما فرق دارد، این پیشوند را نیز باید در این خط تغییر بدهید.
همه قسمت های برنامه را ساختیم، اما یک بخش مهم باقی مانده است و آن قرار دادن دکمه ای در action bar است که بتوانیم توسط آن، وارد صفحه جستجو بشویم. ابتدا یک عکس (که قرار است در action bar نمایش داده شود) را با نام search ، در فولدر drawable-hdpi از پروزه اندروید، کپی کنیم :
سپس فایلی با نام menu.xml می سازیم (در مسیر نمایش داده شده در تصویر زیر) :
کدهای فایل menu.xml را به صورت زیر می نویسیم :
<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 می باشد، کد زیر را می نویسیم :
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 را در زیر نمایش داده ایم :
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() را در آن می نویسیم، بنابراین کدهای نهایی این فایل، به صورت زیر خواهد بود :
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() را در آن می نویسیم، بنابراین کدهای نهایی این فایل، به صورت زیر خواهد بود :
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() را در آن می نویسیم، بنابراین کدهای نهایی این فایل، به صورت زیر خواهد بود :
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() را در آن می نویسیم، بنابراین کدهای نهایی این فایل، به صورت زیر خواهد بود :
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 ساخته ایم. عملیات جستجو، درون عناصر این آرایه صورت می گیرد. شیوه ای که من برای قرار دادن متن ها (عنوان ها) به کار بردم، ابتدا تعریف عنوان ها در آرایه ای در فایل strings.xml و سپس قرار دادن آن در آرایه products می باشد. شما می توانید آرایه products را به هر شیوه دلخواه تعریف کنید. مثلا می توانید متن های مختلف را از یک سری فایل متنی فراخوانی کرده و سپس در عناصر مختلف آرایه products قرار بدهید تا جستجو در بین آن متن ها صورت گیرد. بنابراین تنها تعریف آرایه رشته ای products مهم است و شیوه این کار، بستگی به ساختار برنامه اندروید شما دارد.
به بخش زیر از کدهای فایل Search.java توجه کنید :
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);
}
}
}
});
}
این بخش از کدها، تعیین کرده است که اگر کاربر بر روی یکی از نتایج جستجو اشاره کرد، چه اتفاقی بیفتد. این بخش نیز باید برای ساختارهای مختلف، به طور متفاوت تعریف شود و کدنویسی آن کاملا وابسته به ساختار برنامه اندروید می باشد.
میشه یه آموزش برای جستجو دیتابیس آنلاین یا MYSQL بسازین که مثلا از گوشی یه متن رو بفرستین و بعد بر اساس اون یک سری داده از سرور بگیرین
سلام.
دریافت یک سری داده از صفحات PHP موجود در سرور اینترنتی را در مباحث زیر شرح داده ایم :
بنابراین تنها می ماند اینکه چگونه در صفجه PHP ، نتایج جستجو از پایگاه داده MySQL را دریافت و در خروجی نمایش بدهیم (برگردانیم). شما عبارت جستجو را به صفحه PHP می فرستید و در آن، یک query برای جدول (table) شامل اطلاعات اجرا خواهد شد که در آن query ، باید کلمه LIKE را به کار ببرید (برای یافتن تمامی ردیف های از جدول که آن عبارت در آنها وجود دارد). سپس نتایج برگردانده شده از پایگاه داده را به شکل json در خروجی صفحه PHP برمی گردانید تا برنامه اندروید بتواند بر اساس آن مباحثی که ذکر شد، اطلاعات را دریافت نموده و در یک ListView (یا RecyclerView) نمایش بدهد.
خروجی صفحه PHP را می توانید توسط یک صفحه HTML شامل تگ form ، در مرورگر اینترنت خود چک کنید (تا از صحت خروجی آن اطمینان پیدا کنید).
سلام،من قابلیت جستجو رو با لیست علاقه مندی ها ادغام کردم.درست هم کار میکنه مثلا یست رو نمایش میده و با کلیک روی هر کدوم از آیتم ها به بخش مورد نظر منتقل میشه.اما یه اشکال داره اونم اینه که اگه کلمه ای رو وارد کنم به بخش مورد نظر میتونم برم ولی اگه بعد از کلمه فاصله بزارم همش روی مبحث شماره یک میمونه،اگه کلمه مورد نظرم هم قبلش فاصله باشه بازم همین اتفاق پیش میوفته.رشته ام برقه و بصورت مبتدی شروع کردم لطفا توضیح بدید ممنونم
با سلام کد قسمتی که بر روی ایتم های که سرچ میشود کلیک می کنیم و به صفحه دیگر منتقل میشویم کجاست؟
سلام.
بخش زیر از کدها :
سلام
ی مشکل دارم همین کدهارو میزنم تو برنامم اما در جستجو فارسی تایپ میکنم خودش عدد تایپ میکنه چرا؟؟؟ میشه کمکم کنید؟
هیچجای دیگه نتونستم کدی واسه جستجو پیدا کنم
سلام.منم این مشکل رو دارم.وقتی فارسی تایپ میکنم بهم عدد میده.تازه یه مشکل دیگه هم هست تو آیتم که کلیک میکنم وارد اکتیویتی نمیشه(البته سرچ من تو منوس ناویگیشن دراوره)لطفا یه نفر راهنمایم کنه
سلام ممنون میشم کمک کنید
من تو برنامه ام دو تا string دارم که هر کدوم از یه اکتیوتی دیگه اومدن مثلا زیر
private static String[] str = ListFehha.fehstha;
private static String[] str1 = KhetEntegal.list_fasll;
چطوری میشه با هم تو لیست سرچ اوردش .یا چجوری تو arrayAdapter با هم استفادشون کنم یا اینکه میشه با هم تبدیل به یک string کنم
سلام
من ی برنامه کپی و مخاطب نوشتم
حالا می خوام امکان جسنجو در مخاطبین رو اضافه کنم
نمیتونم این کارو بکنم (ینی جستجو در بین مخاطبین)
میشه کمک کنین
برنامتوبا چی نوشتی؟
سلام واسه سرچ بین مثلا 200 موضوع که به صورت استرینگ هستش چیکار باید کرد چطور میشه رویداد بع از کیک شدن رو براشون ست کرد
سلام
باید چکارش کنم که رو هر کدوم از ایتم ها که بزنم بره به اکتیویتی دیگه
لطفا کمک کنید
ممنون میشم
ممنون داداش
موفق باشید
خواهش میکنم عزیز بدردت خورد یانه؟؟
سلام من طبق آموزش قبلیتون با لیست ویو لیست علاقه مندیهامو ساختم و طبق آموزش لیست جستجو رو هم ساختم ولی تو قسمت جستجو شما از لیست ویوو استفاده نکردین به همین دلیل جستجوی من همه چیزش درسته فقط قسمت مورد نظرمو که جستجو کرد وقتی روش کلیک میکنم که واردش بشم برنامه فورس کلوز میشه لطفا راهنمایم کنید ممنون
سلام منگ همین مشکل شمارو دارم لطفا اگه جوابی براش پیدا کردین برا منم توضیح بدین که مشکلمو حل کنم ممنون به ایمیلم بفرستید اگه راه حلی پیدا کردین متشکرم
navidshk88@gmail.com
سلام من طبق آموزش قبلیتون یه لیست ویو ساختم و صفحه علاقه مندیها که دراونجا ازکلاس گلوبال استفاده شده بود و شما آموزش قسمت جستجورو توی لیست ویو توضیح ندادین و برای هرمبحث یک اکتیویتی اختصاص دادین من قسمت جستجو رو ساختم قسمت فیلتر کارمیکنه ولی چون کد قسمت کلیکش برای لیست ویو نیست من به مشکل خوردم میشه کدقسمت کلیک روی آیتمهارو باتوجه به لیست ویو به ایمیلم ارسال کنید ممنونتون میشم اگه اینکاروبرام انجام بدین خودم خیلی تلاش کردم ولی بی نتیجه بود آخه من تازه کارم
سلام میگم اینجا کسی جواب نمیده چرا؟؟؟
دوستان خواهشا هرکی کدومتون میتونین کمکم کنین ممنون