18

私は Xtend 言語で Java クラスを書きたいと思っています (単純に、そのほうが簡潔だからです)。コーヒースクリプトのように。これどうやってするの?

新しいクラスと同じように Xtend ファイルを作成しようとしましたが、次のエラーが発生します。

'org.eclipse.xtext.xbase.lib'クラスパスに必須のライブラリ バンドルが見つかりません。

これにより、インテリセンス (オートコンプリート) が無効になります。また、それが機能したとしても、Java クラスにコンパイルするにはどうすればよいですか?

4

5 に答える 5

11

Xtend では、内部クラスはドル記号 ('$') を使用して逆参照され、静的メンバーは二重コロン ('::') を使用してアクセスされます。

HelloAndroid アクティビティ コードは次のようになります。

class XtendActivity extends Activity {

    override void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R$layout::main);
    }
}
于 2011-11-11T12:31:01.407 に答える
6

同じことを試してみたところ、Xtend Nature を有効にして、3 つの Xtend ライブラリ (前述の「org.eclipse.xtext.xtend2.lib」、「org.eclipse.xtext.xbase.lib」、および「com」) を追加することが確認できました。 .google.inject') をプロジェクトのライブラリに追加すると、少なくとも Xtend コードがコンパイルされます。ただし、Rクラスにも問題があります。

よく調べてみると、R クラスの問題は、別のディレクトリに配置されていることではないようです。ファイルを別の名前でメイン ソース ディレクトリにコピーしても、何も変わりません。むしろ、いくつかの静的最終サブクラスを含む静的最終クラスである R クラスに問題があるようです。通常のメソッド内で R.layout.main (たとえば) への参照をラップする単純なプレーン Java ラッパー クラスを作成し、それを Xtend コードから呼び出すと、それは受け入れられ、問題なくコンパイルされます。

その後、私が遭遇した次の問題は、「org.eclipse.xtext.xtend2.lib」、「org.eclipse.xtext.xbase.lib」、および「 com.google.inject'. これは、3 つの .jar ファイルのうち 2 つからこれらのファイルを削除することで、比較的簡単に修正できます。後で問題が発生するかどうかはわかりませんが、少なくとも Android エミュレーターで実行されている Xtend コードのスニペットが動作するようになりました。

于 2011-11-06T22:10:16.170 に答える
4

今のところ、「R」クラスをインポートすることはできませんが、コンパイルしました。次の手順を実行します。

最初に、Eclipse アップデート マネージャーに Xtend SDK をインストールします。 「Xtend2 SDK」を選択します。待ってから、Eclipse を再起動します。

Eclipse Android プロジェクト フォルダーで、ファイル「.project」を編集し (たとえば、OSX のターミナルで「nano .project」と入力して)、次のように変更します (名前を除いて、実際にはコンテンツ全体をコピーできます)。名前をプロジェクト名に戻します):

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>TestAndroidXtend</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
    <buildCommand>
        <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>org.eclipse.jdt.core.javabuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
    <buildCommand>
        <name>com.android.ide.eclipse.adt.ApkBuilder</name>
        <arguments>
        </arguments>
    </buildCommand>
</buildSpec>
<natures>
    <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
    <nature>org.eclipse.jdt.core.javanature</nature>
    <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
</natures>

次に、クラスパス要素内のファイル「.classpath」に次を挿入します。

<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

com.android.ide.eclipse.adt.ANDROID_FRAMEWORK のエントリの前に配置しましたが、おそらくそれも行う必要があります。

Eclipse に戻り、F5 でプロジェクトを更新し、プロジェクトの最上位に "META-INF" フォルダーを作成し、空のファイル "MANIFEST.MF" を作成します。次の内容を貼り付けます。

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Xtend Tutorial
Bundle-SymbolicName: xtend.tutorial
Bundle-Version: 2.1.0.qualifier
Bundle-Vendor: Eclipse Modeling
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Require-Bundle: org.eclipse.xtext.xtend2.lib;bundle-version="2.0.0",
 org.junit4,
 org.aopalliance;bundle-version="1.0.0"

プロジェクトで「プロジェクト」->「クリーン」を実行すると、Xtend クラスを作成して使用できるようになります。

前に述べたように、R クラスをインポートすることはできません。おそらく、Xtend は通常の「src」フォルダーでクラス ファイルを検索するだけです。

于 2011-11-06T13:50:18.333 に答える
1

これまでに Android 開発を行ったことはありません。ただし、Xtend コードはシン ランタイム ライブラリ (Java で記述) に対してコンパイルされます。これは主に 3 つの jar ファイルです: - org.eclipse.xtext.xtend2.lib - org.eclipse.xtext.xbase.lib - com.google.collect

それらはすべて Eclipse にインストールされているため、インストールの plugins フォルダーで見つける必要があります。通常、OSGI と PDE を使用してクラスパスに配置しますが、実際にはクラスパスの依存関係にすぎません。

Xtend は、Java と同じように、クラスパスにあるすべてのものをインポートできます。Java プロジェクト構成と Java 開発ツールを再利用します。したがって、クラスパスに「R」クラスがある限り、機能するはずです。Xtend ファイルの隣にある Java からは参照できるが、参照できない場合は、bugs.eclipse.org (Modeling/TMF/Xtext の下) で bugzilla をファイルしてください。小さな例と追加の説明を提供します。

于 2011-11-06T19:08:25.670 に答える
0

パラメータ名が R.java 内のものと競合しないようにしてください。

ウィザードを使用して (Java) アクティビティを作成し、コードをコピーしてアクティビティを削除し、代わりに MainActivity.xtend を次のように作成しました。


public class MainActivity extends Activity {

    override void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R$layout::activity_main);
    }

    override boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R$menu::activity_main, menu);
        return true;
    }

.xtend ファイルでは問題ないように見えますが、生成された Java コードが

  public boolean onCreateOptionsMenu(final Menu menu) {
    MenuInflater _menuInflater = this.getMenuInflater();
    _menuInflater.inflate(menu.activity_main, menu);
    return true;
  }

この時点で activity_main が好きではありません。

「メニュー」パラメーターが R.menu.activity_main をオーバーライドしていることを理解するのに数分かかりました。.xtend の "menu" パラメータを "optionsMenu" に変更すると、問題なく動作しました。

于 2012-10-16T02:51:29.267 に答える