我不知道如何通过Delphi代码在Android上设置主视图/布局。
我有以下名为'activity_tv.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">
<TextView
android:id="@+id/text_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/hello"/>
</LinearLayout>
我有以下名为'strings.xml'的字符串文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello!</string>
</resources>
两者都以正确的输出目录作为ProjectFile
添加到部署部分中。两者都正常工作,并且我可以使用以下代码接收非零资源ID:
LayoutID := TAndroidHelper.Activity.getResources.getIdentifier(
TAndroidHelper.StringToJString('tvlayout'),
TAndroidHelper.StringToJString('layout'),
TAndroidHelper.Activity.getPackageName()
);
StringID := TAndroidHelper.Activity.getResources.getIdentifier(
TAndroidHelper.StringToJString('hello'),
TAndroidHelper.StringToJString('string'),
TAndroidHelper.Activity.getPackageName()
);
我正在尝试设置主要活动的布局,但没有任何反应。这是我正在尝试的代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
CallInUIThread(SetMainLayout);
end;
procedure TForm1.SetMainLayout;
var
LayoutID: Integer;
begin
LayoutID := TAndroidHelper.Activity.getResources.getIdentifier(
TAndroidHelper.StringToJString('tvlayout'),
TAndroidHelper.StringToJString('layout'),
TAndroidHelper.Activity.getPackageName()
);
TAndroidHelper.Activity.setContentView(LayoutID);
end;
这就是整个项目。我在表单上确实有一个按钮,并试图从其Click处理程序中调用CallInUIThread(SetMainLayout)
,但是发生了同样的事情:该按钮停留在表单上,但看不到我的视图。我尝试过移动按钮,以防它挡住路。
我尝试用两种不同的方式自己扩大布局。两次我都得到了一个有效的View指针(我以为是),该应用程序也没有崩溃,但是它也没有做任何事情:
//attempt one
inflater := TJLayoutInflater.JavaClass.from(TAndroidHelper.Context);
layoutView := inflater.inflate(LayoutID, nil);
TAndroidHelper.Activity.setContentView(layoutView);
//attempt two
InfObj := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.LAYOUT_INFLATER_SERVICE);
Inflater := TJLayoutInflater.Wrap((InfObj as ILocalObject).GetObjectID);
layoutView := Inflater.inflate(LayoutID, nil);
TAndroidHelper.Activity.setContentView(layoutView);
我认为也许我必须向AppManifest添加一个活动,但是我在Android Studio中重复了以下步骤,一切正常:
setContentView(R.layout.activity_main);
更改为setContentView(R.layout.activity_tv);
为了很好,我创建了一个全新的Delphi项目,以确保我不会错过任何内容。唯一的Delphi代码文件在这里:
unit Unit1;
interface
uses
FMX.Forms, Androidapi.Helpers, FMX.Helpers.Android;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure SetMainLayout;
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
CallInUIThread(SetMainLayout);
end;
procedure TForm1.SetMainLayout;
var
LayoutID: Integer;
begin
LayoutID := TAndroidHelper.Activity.getResources.getIdentifier(
TAndroidHelper.StringToJString('activity_tv'),
TAndroidHelper.StringToJString('layout'),
TAndroidHelper.Activity.getPackageName()
);
TAndroidHelper.Activity.setContentView(LayoutID);
end;
end.
如何让setContentView
在Delphi中工作?
Delphi版本:
Embarcadero® Delphi 10 Seattle Version 23.0.20618.2753