我正在开发一个android cordova自定义布局插件。当用户单击按钮时,应用程序将调用android插件并显示自定义布局。用户可以在android cordova插件的自定义布局中移动对象。但是,当我在我的java代码中调用我的xml文件时,我的插件有问题。以下是我的代码。
的src /机器人/ CustomLayout.java
public class CustomLayout extends CordovaPlugin {
private static final String LOG_TAG = "CustomNotification";
public CallbackContext callbackContext;
Context context;
Resources resources;
String packageName;
public CustomLayout(){
}
@Override
public boolean execute(String action, String rawArgs, CallbackContext callbackContext) throws JSONException {
this.callbackContext = callbackContext;
context = cordova.getActivity().getApplicationContext();
resources = context.getResources();
packageName = context.getPackageName();
if (action.equals("layout")) {
customLayout();
return true;
}
return false;
}
private void customLayout() {
Log.e(TAG, "show");
cordova.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
cordova.getActivity().setContentView(resources.getIdentifier("custom_layout", "layout", packageName));
ImageView motion = (ImageView) cordova.getActivity().findViewById(resources.getIdentifier("tvDragMe","id",packageName));
motion.setOnTouchListener(new MyTouchListener());
}
});
}
}
class MyTouchListener implements View.OnTouchListener {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("", "");
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(data, shadowBuilder, view, 0);
view.setVisibility(View.INVISIBLE);
return true;
} else {
return false;
}
}
}
WWW / customlayout.js
var exec = require('cordova/exec');
var platform = require('cordova/platform');
module.exports = {
alert: function(completeCallback) {
exec(completeCallback, null, "CustomLayout", "layout", []);
}
};
RES /布局/ custom_layout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<ImageView
android:id="@+id/tvDragMe"
android:src="@drawable/smiles"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_light"
android:padding="10dp"
android:textColor="#ffffff"
android:layout_marginTop="35dp"
android:text="Drag Me" />
</RelativeLayout>
XML文件
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
id="cordova-plugin-custom_layout" version="1.0.0">
<name>Custom Layout</name>
<description>Cordova Custom Layout Plugin</description>
<keywords>cordova,layout</keywords>
<js-module src="www/customlayout.js" name="customlayout">
<merges target="customlayout" />
</js-module>
<platform name="android">
<config-file target="res/xml/config.xml" parent="/*">
<feature name="CustomLayout">
<param name="android-package" value="org.apache.cordova.dialogs.CustomLayout"/>
</feature>
</config-file>
<source-file src="res/layout/custom_layout.xml" target-dir="res/layout/custom_layout.xml" />
</platform>
</plugin>
答案 0 :(得分:0)
以下是我的问题的源代码,因为我没有在我的Java文件中设置view和setViewByID。以下源代码就是答案。
的src /机器人/ CustomLayout.java 公共类CustomLayout扩展了CordovaPlugin {
private static final String LOG_TAG = "CustomLayout";
public CustomLayout() {
}
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("alert")) {
this.alert();
return true;
}
return false;
}
public synchronized void alert() {
final CordovaInterface cordova = this.cordova;
Runnable runnable = new Runnable() {
public void run() {
AlertDialog.Builder dlg = new AlertDialog.Builder(cordova.getActivity(), AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
Application app = cordova.getActivity().getApplication();
String package_name = app.getPackageName();
Resources resources = app.getResources();
int layout = resources.getIdentifier("customlayout", "layout", package_name);
int image = resources.getIdentifier("tvDragMe", "id", package_name);
LayoutInflater inflater = cordova.getActivity().getLayoutInflater();
View customview = inflater.inflate(layout, null);
dlg.setView(customview);
ImageView motion = (ImageView) customview.findViewById(image);
motion.setOnTouchListener(new MyTouchListener());
dlg.create();
dlg.show();
};
};
this.cordova.getActivity().runOnUiThread(runnable);
}
private class MyTouchListener implements View.OnTouchListener {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("", "");
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(data, shadowBuilder, view, 0);
view.setVisibility(View.INVISIBLE);
return true;
} else {
return false;
}
}
}
XML文件
<name>Layout</name>
<description>Cordova Custom Dialog Layout Plugin</description>
<keywords>cordova,layout</keywords>
<js-module src="www/customlayout.js" name="customlayout">
<merges target="customlayout" />
</js-module>
<!-- android -->
<platform name="android">
<config-file target="res/xml/config.xml" parent="/*">
<feature name="CustomLayout">
<param name="android-package" value="org.apache.cordova.dialogs.CustomLayout"/>
</feature>
</config-file>
<source-file src="src/android/CustomLayout.java" target-dir="src/org/apache/cordova/dialogs" />
<source-file src="src/android/res/drawable/smiles.jpg" target-dir="res/drawable" />
<source-file src="src/android/res/layout/customlayout.xml" target-dir="res/layout" />
</platform>