可以 use/layout 编写视图并 Activity 编写 Java 吗?
Possible to use/layout a compose view in and Activity written in Java?
Google 给出了以下示例,说明如何在 XML 中使用 ComposeView 并在片段中扩充它。
class ExampleFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
return inflater.inflate(
R.layout.fragment_example, container, false
).apply {
findViewById<ComposeView>(R.id.compose_view).setContent {
// In Compose world
MaterialTheme {
Text("Hello Compose!")
}
}
}
}
}
我有一个 activity 是用 java 写的,不是 kotlin。是否可以使用 Java activity 中的 setContent?如果是这样,我正在为语法而苦苦挣扎。
是的,有可能。
首先你应该创建一个子类 AbstractComposeView
:
class MyComposeView
@JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
AbstractComposeView(context, attrs) {
@Composable
override fun Content() {
YourComposableFunction()
}
}
然后将此视图设置为 Activity 内容...
public class MyJavaActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyComposeView(this));
}
}
您还可以在任何布局文件中声明您的视图...
<com.example.MyComposeView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
并像往常一样调用 setContentView(R.layout.your_layout_file)
。
无需创建 AbstractComposeView
,您可以简单地包装一个 kotlin 函数并传递 activity 实例并设置内容。
例如:
object ComposeContent {
fun setContentFromJavaActivity(activity: AppCompatActivity) {
activity.setContent {
// Your composable content goes here
}
}
}
Activity onCreate(..)
:-
public class MyJavaActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ComposeContent.INSTANCE.setContentFromJavaActivity(this);
}
}
(创建 AbstractComposeView
或 ComposeView
的实例只有在我们想要渲染 Activity 的一部分时才会派上用场 UI (或在 Fragment
))
Google 给出了以下示例,说明如何在 XML 中使用 ComposeView 并在片段中扩充它。
class ExampleFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// Inflate the layout for this fragment
return inflater.inflate(
R.layout.fragment_example, container, false
).apply {
findViewById<ComposeView>(R.id.compose_view).setContent {
// In Compose world
MaterialTheme {
Text("Hello Compose!")
}
}
}
}
}
我有一个 activity 是用 java 写的,不是 kotlin。是否可以使用 Java activity 中的 setContent?如果是这样,我正在为语法而苦苦挣扎。
是的,有可能。
首先你应该创建一个子类 AbstractComposeView
:
class MyComposeView
@JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
AbstractComposeView(context, attrs) {
@Composable
override fun Content() {
YourComposableFunction()
}
}
然后将此视图设置为 Activity 内容...
public class MyJavaActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyComposeView(this));
}
}
您还可以在任何布局文件中声明您的视图...
<com.example.MyComposeView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
并像往常一样调用 setContentView(R.layout.your_layout_file)
。
无需创建 AbstractComposeView
,您可以简单地包装一个 kotlin 函数并传递 activity 实例并设置内容。
例如:
object ComposeContent {
fun setContentFromJavaActivity(activity: AppCompatActivity) {
activity.setContent {
// Your composable content goes here
}
}
}
Activity onCreate(..)
:-
public class MyJavaActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ComposeContent.INSTANCE.setContentFromJavaActivity(this);
}
}
(创建 AbstractComposeView
或 ComposeView
的实例只有在我们想要渲染 Activity 的一部分时才会派上用场 UI (或在 Fragment
))