سؤال

أرغب في إضافة طريقة عرض داخل FrameLayout برمجيًا ووضعها في نقطة محددة داخل التخطيط بعرض وارتفاع محددين. هل تدعم Framelayout هذا؟ إذا لم يكن الأمر كذلك ، فهل يجب أن أستخدم مجموعة ViewGroup الوسيطة لتحقيق ذلك؟

int x; // Can be negative?
int y; // Can be negative?
int width;
int height;
View v = new View(context);
// v.setLayoutParams(?); // What do I put here?
frameLayout.addView(v);

كانت فكرتي الأولية هي إضافة طبع المطلقة إلى Framelayout ووضع المنظر داخل المطلقة المطلقة. لسوء الحظ ، اكتشفت أن Absolutelayout قد تم إهمالها.

أي مؤشرات ستكون موضع تقدير كبير. شكرًا.

هل كانت مفيدة؟

المحلول

صحيح أنه مع FrameLayout يتم ربط جميع الأطفال إلى أعلى يسار الشاشة ، ولكن لا يزال لديك بعض التحكم في وضع حشوهم. إذا قمت بتعيين قيم حشوة مختلفة لأطفال مختلفين ، فسوف تظهر في أماكن مختلفة في Framelayout.

نصائح أخرى

يوضح المثال التالي (رمز العمل) كيفية وضع عرض (edittext) داخل FrameLayout. كما أنه يوضح كيفية تعيين موضع editText باستخدام setPadding Setter من FrameLayout (في كل مرة ينقر المستخدم على FrameLayout ، يتم تعيين موضع edittext على موضع النقر):

public class TextToolTestActivity extends Activity{
    FrameLayout frmLayout;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        frmLayout = (FrameLayout)findViewById(R.id.frameLayout1);
        frmLayout.setFocusable(true);
        EditText et = new EditText(this);

        frmLayout.addView(et,100,100);
        frmLayout.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.i("TESTING","touch x,y == " + event.getX() + "," +     event.getY() );
                frmLayout.setPadding(Math.round(event.getX()),Math.round(event.getY()) , 0, 0);
            return true;
        }
    });

}

}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <FrameLayout 
        android:id="@+id/frameLayout1" 
        android:layout_height="fill_parent" android:layout_width="fill_parent">
    </FrameLayout>

</LinearLayout>

يمكنك أيضًا إضافة هامش حول العرض المضافة حديثًا لوضعه داخل FrameLayout.

FrameLayout frameLayout = (FrameLayout) findViewById(R.id.main); // or some other R.id.xxx
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(0, metrics.heightPixels - 20, 0, 0);
View v = new View(context);
v.setLayoutParams(params);
frameLayout.addView(v);

سيؤدي ذلك إلى وضع Framelayout 20 بكسل من أسفل الشاشة.

يحرر: أكمل المثال بحيث يقف بنفسه. وأوه ، نعم إنه يعمل.

من حلقة الوصل Quinn1000 المقدمة:

يمكنك إضافة العديد من الأطفال إلى FrameLayout ، ولكن جميع الأطفال مرتبطون بأعلى يسار الشاشة.

هذا يعني أنه لا يمكنك وضع عرضك في نقطة محددة داخل FrameLayout (إلا أنك تريد أن تكون في الزاوية اليسرى العلوية :-)).

إذا كنت بحاجة إلى تحديد المواقع المطلقة للعرض ، فحاول المطلقة:

تخطيط يتيح لك تحديد مواقع دقيقة (الإحداثيات x/y) لأطفالها. التخطيطات المطلقة أقل مرونة وأصعب في الحفاظ عليها من الأنواع الأخرى من التخطيطات دون تحديد المواقع المطلقة.

أما بالنسبة لتحديد عرض وارتفاع العرض ، كما قال Quinn1000 ، فإنك تزود v.setLayoutParams() الطريقة أ LayoutParams كائن ، اعتمادًا على الحاوية التي اخترتها (Abssolblayout ، linearlayout ، إلخ)

الخيط هنا على Stackoverflow في

كيف يمكنك setLayoutParams () للحصول على ImageView؟

يغطيها إلى حد ما.

على سبيل المثال: linearlayout.layoutparams layoutparams = new LineArlayout.layoutParams (30 ، 30) ؛ yutimageView.setLayoutParams (LayoutParams) ؛

يشير إلى أنك تحتاج إلى تحديد كائن linearlayout.layoutparams (أو في حالتك a framelayout.layoutparams) لتمريرها إلى طريقة setLayoutParams لكائن V الخاص بك.

في

http://developer.android.com/reference/android/widget/framelayout.html

يكاد يجعل الأمر يبدو وكأنه يمكن أن تطلب من V الخاص بك:

enderatedefaultLayoutParams () عبر هذه الطريقة إذا لم تكن قد حددت المعلمات على وجه التحديد.

لكن الوقت متأخر ، وتلك الروابط تجعل عيني تنزف قليلاً. اسمحوا لي أن أعرف إذا كانوا nhelp أي :-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top