implement android navbar custom left & right view
This commit is contained in:
parent
848b7005b7
commit
894f23cd5b
@ -77,6 +77,13 @@ public class DoricContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void clearHeadNodes(String type) {
|
||||||
|
Map<String, ViewNode> map = mHeadNodes.get(type);
|
||||||
|
if (map != null) {
|
||||||
|
map.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ViewNode targetViewNode(String id) {
|
public ViewNode targetViewNode(String id) {
|
||||||
if (id.equals(mRootNode.getId())) {
|
if (id.equals(mRootNode.getId())) {
|
||||||
return mRootNode;
|
return mRootNode;
|
||||||
|
@ -72,6 +72,18 @@ public class BaseDoricNavBar extends FrameLayout implements IDoricNavBar {
|
|||||||
mTvTitle.setText(title);
|
mTvTitle.setText(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setLeft(View view) {
|
||||||
|
mLeftContainer.removeAllViews();
|
||||||
|
mLeftContainer.addView(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRight(View view) {
|
||||||
|
mRightContainer.removeAllViews();
|
||||||
|
mRightContainer.addView(view);
|
||||||
|
}
|
||||||
|
|
||||||
private void updateTitleMargins() {
|
private void updateTitleMargins() {
|
||||||
try {
|
try {
|
||||||
int width = mRightContainer.getRight() - mLeftContainer.getLeft();
|
int width = mRightContainer.getRight() - mLeftContainer.getLeft();
|
||||||
@ -102,4 +114,5 @@ public class BaseDoricNavBar extends FrameLayout implements IDoricNavBar {
|
|||||||
super.onLayout(changed, left, top, right, bottom);
|
super.onLayout(changed, left, top, right, bottom);
|
||||||
updateTitleMargins();
|
updateTitleMargins();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package pub.doric.navbar;
|
package pub.doric.navbar;
|
||||||
|
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Description: pub.doric.navbar
|
* @Description: pub.doric.navbar
|
||||||
* @Author: pengfei.zhou
|
* @Author: pengfei.zhou
|
||||||
@ -28,4 +30,8 @@ public interface IDoricNavBar {
|
|||||||
void setTitle(String title);
|
void setTitle(String title);
|
||||||
|
|
||||||
void setBackgroundColor(int color);
|
void setBackgroundColor(int color);
|
||||||
|
|
||||||
|
void setLeft(View view);
|
||||||
|
|
||||||
|
void setRight(View view);
|
||||||
}
|
}
|
||||||
|
@ -15,19 +15,22 @@
|
|||||||
*/
|
*/
|
||||||
package pub.doric.plugin;
|
package pub.doric.plugin;
|
||||||
|
|
||||||
import android.view.View;
|
import android.widget.FrameLayout;
|
||||||
import android.view.ViewGroup;
|
|
||||||
|
|
||||||
import com.github.pengfeizhou.jscore.ArchiveException;
|
import com.github.pengfeizhou.jscore.ArchiveException;
|
||||||
import com.github.pengfeizhou.jscore.JSDecoder;
|
import com.github.pengfeizhou.jscore.JSDecoder;
|
||||||
import com.github.pengfeizhou.jscore.JSObject;
|
import com.github.pengfeizhou.jscore.JSObject;
|
||||||
import com.github.pengfeizhou.jscore.JavaValue;
|
import com.github.pengfeizhou.jscore.JavaValue;
|
||||||
|
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
import pub.doric.DoricContext;
|
import pub.doric.DoricContext;
|
||||||
|
import pub.doric.async.AsyncResult;
|
||||||
import pub.doric.extension.bridge.DoricMethod;
|
import pub.doric.extension.bridge.DoricMethod;
|
||||||
import pub.doric.extension.bridge.DoricPlugin;
|
import pub.doric.extension.bridge.DoricPlugin;
|
||||||
import pub.doric.extension.bridge.DoricPromise;
|
import pub.doric.extension.bridge.DoricPromise;
|
||||||
import pub.doric.navbar.IDoricNavBar;
|
import pub.doric.navbar.IDoricNavBar;
|
||||||
|
import pub.doric.shader.ViewNode;
|
||||||
import pub.doric.utils.ThreadMode;
|
import pub.doric.utils.ThreadMode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,6 +40,10 @@ import pub.doric.utils.ThreadMode;
|
|||||||
*/
|
*/
|
||||||
@DoricPlugin(name = "navbar")
|
@DoricPlugin(name = "navbar")
|
||||||
public class NavBarPlugin extends DoricJavaPlugin {
|
public class NavBarPlugin extends DoricJavaPlugin {
|
||||||
|
|
||||||
|
private static final String TYPE_LEFT = "navbar_left";
|
||||||
|
private static final String TYPE_RIGHT = "navbar_right";
|
||||||
|
|
||||||
public NavBarPlugin(DoricContext doricContext) {
|
public NavBarPlugin(DoricContext doricContext) {
|
||||||
super(doricContext);
|
super(doricContext);
|
||||||
}
|
}
|
||||||
@ -104,4 +111,90 @@ public class NavBarPlugin extends DoricJavaPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@DoricMethod(thread = ThreadMode.UI)
|
||||||
|
public void setLeft(JSDecoder decoder, final DoricPromise promise) {
|
||||||
|
try {
|
||||||
|
final JSObject jsObject = decoder.decode().asObject();
|
||||||
|
getDoricContext().getDriver().asyncCall(new Callable<Object>() {
|
||||||
|
@Override
|
||||||
|
public Object call() throws Exception {
|
||||||
|
String viewId = jsObject.getProperty("id").asString().value();
|
||||||
|
String type = jsObject.getProperty("type").asString().value();
|
||||||
|
ViewNode node = ViewNode.create(getDoricContext(), type);
|
||||||
|
node.setId(viewId);
|
||||||
|
node.init(new FrameLayout.LayoutParams(0, 0));
|
||||||
|
node.blend(jsObject.getProperty("props").asObject());
|
||||||
|
|
||||||
|
getDoricContext().getDoricNavBar().setLeft(node.getNodeView());
|
||||||
|
|
||||||
|
getDoricContext().clearHeadNodes(TYPE_LEFT);
|
||||||
|
getDoricContext().addHeadNode(TYPE_LEFT, node);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}, ThreadMode.UI).setCallback(new AsyncResult.Callback<Object>() {
|
||||||
|
@Override
|
||||||
|
public void onResult(Object result) {
|
||||||
|
promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
promise.reject(new JavaValue(t.getLocalizedMessage()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFinish() {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
promise.reject(new JavaValue(e.getLocalizedMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@DoricMethod(thread = ThreadMode.UI)
|
||||||
|
public void setRight(JSDecoder decoder, final DoricPromise promise) {
|
||||||
|
try {
|
||||||
|
final JSObject jsObject = decoder.decode().asObject();
|
||||||
|
getDoricContext().getDriver().asyncCall(new Callable<Object>() {
|
||||||
|
@Override
|
||||||
|
public Object call() throws Exception {
|
||||||
|
String viewId = jsObject.getProperty("id").asString().value();
|
||||||
|
String type = jsObject.getProperty("type").asString().value();
|
||||||
|
ViewNode node = ViewNode.create(getDoricContext(), type);
|
||||||
|
node.setId(viewId);
|
||||||
|
node.init(new FrameLayout.LayoutParams(0, 0));
|
||||||
|
node.blend(jsObject.getProperty("props").asObject());
|
||||||
|
|
||||||
|
getDoricContext().getDoricNavBar().setRight(node.getNodeView());
|
||||||
|
|
||||||
|
getDoricContext().clearHeadNodes(TYPE_RIGHT);
|
||||||
|
getDoricContext().addHeadNode(TYPE_RIGHT, node);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}, ThreadMode.UI).setCallback(new AsyncResult.Callback<Object>() {
|
||||||
|
@Override
|
||||||
|
public void onResult(Object result) {
|
||||||
|
promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
promise.reject(new JavaValue(t.getLocalizedMessage()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFinish() {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
promise.reject(new JavaValue(e.getLocalizedMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user