Firemonkey setContentView

时间:2018-07-15 16:56:08

标签: android delphi firemonkey

我不知道如何通过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中重复了以下步骤,一切正常:

  1. 使用主要活动创建一个空项目
  2. 创建一个名为activity_tv.xml的新布局文件,其中包含该问题的确切代码。
  3. 编辑strings.xml以包括“ hello”字符串。
  4. 将MainActivity类中的调用从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 

0 个答案:

没有答案