Наложение макета 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);
}
}
Но когда я запускаю свой проект, активность ничего мне не показывает.
Ответы
Ответ 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/