مدیریت اندازه صفحه نمایش موبایل یا تبلت

جهت بدست آوردن اندازه صفحه نمایش از کلاس Display استفاده می کنیم. علاوه براین باید معیار اندازه را نیز با DisplayMetrics بدست آوریم. با توجه به اینکه اندازه و کیفیت تصویر(رزولوشن) هر دو باید در نظر گرفته شوند در نتیجه از متد density هم باید استفاده کرد. نحوه استفاده از این کلاس ها و متدها به صورت زیر است:

Display display=this.getWindowManager().getDefaultDisplay();
        DisplayMetrics metrics=new DisplayMetrics();
        display.getMetrics(metrics);
        float density=this.getResources().getDisplayMetrics().density;

حال برای بدست آوردن طول و عرض صفحه نمایش از متغیرهای dpWidth و dpHeight استفاده می شود:

dpWidth=metrics.widthPixels/density;
        dpHeight=metrics.heightPixels/density;

جهت نمایش طول و عرض ابتدا یک منو بصورت زیر ایجاد می کنیم و نام آنرا dimensions قرار می دهیم:

public boolean onCreateOptionsMenu(Menu menu) {
        menu.add("dimensions").setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                //Toast.makeText(MainActivity.this, "aaa", Toast.LENGTH_SHORT).show();
                showDimension();
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

سپس تابع showDimension بصورت زیر تعریف می شود:

 private void showDimension() {
        Display display=this.getWindowManager().getDefaultDisplay();
        DisplayMetrics metrics=new DisplayMetrics();
        display.getMetrics(metrics);
        float density=this.getResources().getDisplayMetrics().density;
        float dpWidth,dpHeight;
        dpWidth=metrics.widthPixels/density;
        dpHeight=metrics.heightPixels/density;
        Toast.makeText(this, "Width is: "+dpWidth+", Height is: "+dpHeight, Toast.LENGTH_LONG).show();
        //return dpWidth;
    }

حال با اجرای برنامه و انتخاب منوی dimensions نتیجه برای یک تبلت به صورت زیر است:

نمایش Toast برای ابعاد صفحه نمایش

حال قصد داریم در مثالی همانطوریکه در شکل بالا مشاهده می شود برنامه ابعاد متفاوت صفحه نمایش را تشخیص دهد و براساس آن تک ستونه و دو ستونه باشد. چنانچه پهنا کمتر از ۶۰۰ بود تک ستونه باشد و فقط لیست ویو نمایش داده شود و در غیر اینصورت دوستونه باشد و مانند شکل بالا روی هر آیتم لیست که کلیک شد جزییات در کنار آن نشان داده شود. این مثال ادامه ی برنامه بانک اطلاعاتی است. برای این منظور ابتدا یک پوشه جدید در layout با نام layout-sw600dp ایجاد می کنیم و در پوشه ساخته شده فایل mainactivity.xml را کپی می کنیم. باید نتیجه به صورت زیر شود:

چند mainactivity.xml

به فایل mainActivity.xml‌ در پوشه ی layout-sw600dp رفته و کد به صورت زیر تغییر میابد:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context="ir.faratez.msession5.MainActivity">
    <FrameLayout
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Large screen"
            android:layout_gravity="center"
            android:gravity="center"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:weightSum="10">

            <ImageView
                android:id="@+id/imageView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                app:srcCompat="@android:drawable/sym_def_app_icon" />

            <EditText
                android:id="@+id/edt_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="9"
                android:ems="10"
                android:hint="Name"
                android:inputType="textPersonName" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:weightSum="10">

            <ImageView
                android:id="@+id/imageView2"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginLeft="10dp"
                android:layout_weight="1.75"
                android:background="@android:color/darker_gray"
                app:srcCompat="@android:drawable/stat_sys_speakerphone" />

            <EditText
                android:id="@+id/edt_phone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_weight="6.89"
                android:ems="10"
                android:hint="Phone"
                android:inputType="phone" />
        </LinearLayout>

        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:text="ذخیره" />

        <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </FrameLayout>
    <FrameLayout
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent">
        <LinearLayout
            android:layout_marginTop="250dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center
"               android:gravity="center"
                android:text="aaa"
                android:id="@+id/tv_larges_id"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="70dp"
                android:layout_gravity="center
"               android:gravity="center"
                android:text="bbb"
                android:id="@+id/tv_larges_name"/>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="70dp"
                android:layout_gravity="center
"               android:gravity="center"
                android:text="ccc"
                android:id="@+id/tv_larges_phone"/>
        </LinearLayout>
    </FrameLayout>
</LinearLayout>

سپس به کلاس Database میرویم و متد getId را اضافه می کنیم:

public String[] getId(String name,String phone){
        SQLiteDatabase db=getWritableDatabase();
        String q="select * from "+myTable +" where name='"+ name+"' and phone='"+phone+"'";
        Cursor cursor= db.rawQuery(q,null);
        String[] r=new String[1];

            cursor.moveToFirst();
            r[0]=cursor.getString(0);

        db.close();
        return r;
    }

سپس به MainActivity میرویم و کد زیر را در متد getView ادامه کدهای قبل می نویسیم.

 row.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String[] id=dbHelper.getId(tv_name.getText().toString(),tv_phone.getText().toString());
                    //Toast.makeText(MainActivity.this, id[0], Toast.LENGTH_SHORT).show();

مجدد به کلاس DataBase می رویم و متد getDetails را به صورت زیر می نویسیم:

 public  String[] getDetails(String id){
        SQLiteDatabase db=getWritableDatabase();
        String q="select * from "+myTable +" where id='"+ id+"'";
        Cursor cursor= db.rawQuery(q,null);
        String[] r=new String[3];

        cursor.moveToFirst();
        r[0]=cursor.getString(0);
        r[1]=cursor.getString(1);
        r[2]=cursor.getString(2);

        db.close();
        return r;


    }

در ادامه مجدد به MainActitvity‌برگشته و کدر زیر را در آن مینویسیم:

 String[] d;
                    d=dbHelper.getDetails(id[0]);
                    //Toast.makeText(MainActivity.this, d[0]+" "+d[1], Toast.LENGTH_SHORT).show();
                    float w=showDimension();

همانطوریکه مشاهده می شود تابع showDimension مقدار اعشاری برمیگرداند که به صورت زیر تغییر کرده است:

 private float showDimension() {
        Display display=this.getWindowManager().getDefaultDisplay();
        DisplayMetrics metrics=new DisplayMetrics();
        display.getMetrics(metrics);
        float density=this.getResources().getDisplayMetrics().density;
        float dpWidth,dpHeight;
        dpWidth=metrics.widthPixels/density;
        dpHeight=metrics.heightPixels/density;
        //Toast.makeText(this, "Width is: "+dpWidth+", Height is: "+dpHeight, Toast.LENGTH_LONG).show();
        return dpWidth;
    }

حال وقت آن است که برطبق مقدار w (عرض صفحه نمایش) نمایش برنامه متفاوت باشد. پس به صورت زیر کد مربوط به نمایش در w>600 (تبلت ) را می نویسیم:

if (w>600){
                        //Toast.makeText(MainActivity.this, "Large Screen", Toast.LENGTH_SHORT).show();
                        tv_large_id.setText("ID is: " + d[0]);
                        tv_large_name.setText("Name is: " + d[1]);
                        tv_large_phone.setText("Phone is: " + d[2]);




                    }

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

else{
                        Toast.makeText(MainActivity.this, "Small Screen", Toast.LENGTH_SHORT).show();
                        Intent intent =new Intent(MainActivity.this,MainActivity2.class);
                        intent.putExtra("id",d[0]);
                        intent.putExtra("name",d[1]);
                        intent.putExtra("phone",d[2]);
                        startActivity(intent);
                    }

اکتیویتی بعدی مربوط به صفحه نمایش های کوچک به صورت زیر است:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_marginTop="250dp"
    tools:context=".MainActivity2">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center
"               android:gravity="center"
        android:text="aaa"
        android:id="@+id/tv_smalls_id"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="70dp"
        android:layout_gravity="center
"               android:gravity="center"
        android:text="bbb"
        android:id="@+id/tv_smalls_name"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="70dp"
        android:layout_gravity="center
"               android:gravity="center"
        android:text="ccc"
        android:id="@+id/tv_smalls_phone"/>

</LinearLayout>
public class MainActivity2 extends AppCompatActivity {
    TextView tv_small_id,tv_small_name,tv_small_phone;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        tv_small_id=findViewById(R.id.tv_smalls_id);
        tv_small_name=findViewById(R.id.tv_smalls_name);
        tv_small_phone=findViewById(R.id.tv_smalls_phone);
        Bundle b=getIntent().getExtras();
        String id=b.getString("id");
        tv_small_id.setText("ID is: "+id);
        String name=b.getString("name");
        tv_small_name.setText("Name is: "+name);
        String phone=b.getString("phone");
        tv_small_phone.setText("Phone is: "+phone);

    }
}