Подтвердить что ты не робот

Наложение макета xml в пользовательский класс View

У меня есть класс View1, который расширяет View. Я хочу раздуть R.layout.test2.xml в этом классе View1. Я поставил следующий код в этом классе

public class View1 extends View {

    View view;
    String[] countries = new String[] {"India", "USA", "Canada"};

    public View1( Context context) {
        super(context);
        LayoutInflater  mInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view=mInflater.inflate(R.layout.test2, null, false);
    }
}

Из другого класса Home Я хочу, чтобы это завышенное представление было там для некоторых обстоятельств. В классе Home я написал следующий код:

public class Home extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);
        CreateView();   
    }

    public void CreateView() {
        LinearLayout lv=(LinearLayout)findViewById(R.id.linearlayout);
        View1 view = new View1(Home.this);
        lv.addView(view);
    }
}

Но когда я запускаю свой проект, активность ничего мне не показывает.

4b9b3361

Ответ 1

Вы не можете добавлять представления в класс View, вместо этого вы должны использовать ViewGroup или один из его подклассов (например, Linearlayout, RelativeLayout и т.д.). Тогда ваш код будет выглядеть следующим образом:

public class View1 extends LinearLayout {

    View view;
    String[] countries = new String[] {"India", "USA", "Canada"};

    public View1( Context context) {
        super(context);
        LayoutInflater  mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mInflater.inflate(R.layout.test2, this, true);}}

Также строка:

mInflater.inflate(R.layout.test2, null, false)

ничего не добавляет к текущему виду (из-за параметра false), он просто раздувает View из макета xml.

Ответ 2

Используйте этот

    LayoutInflater li = (LayoutInflater)getContext().getSystemService(infService);
    li.inflate(R.layout.test2, **this**, true);

Вы должны использовать this, а не null и изменить параметр false (boolean AttachToRoot) на true

Ответ 3

Используйте приведенный ниже код, чтобы раздуть макет, тогда вы можете использовать это представление для любых целей. Это даст вам самый родительский макет вашего XML файла. Введите тип и используйте его соответственно.

View headerView = View.inflate(this, R.layout.layout_name, null);

Ответ 4

Вы добавляете пустой вид домашней активности. Потому что в классе View1 у вас есть только раздутый вид, но не добавляйте нигде.

Ответ 5

Вы должны использовать ViewGroup как FrameLayout и выполните:

public class View1 extends FrameLayout {

    public View1(Context context) {
        super(context);
        inflate(context, R.layout.view1, this);
    }
}

В макете XML используйте тег <merge, чтобы не просто добавить макет view1 к корневому макету, что означает, что у нас есть пустой FrameLayout и ваш определенный вид рядом друг с другом.

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="content" />

</merge>

См. http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/