Android RTL布局元素不能在所有设备上正常工作
我已经将默认语言设置为阿拉伯语(ar),它在我的阿尔卡特设备(版本6棉花糖)上按预期工作,但当我在三星设备(版本4.1.2 JellyBean)上运行此应用程序时,工具栏(顶部和底部)不会显示为RTL布局元素。查看下面两张图片 阿尔卡特视图运行良好Android RTL布局元素不能在所有设备上正常工作,android,android-layout,android-recyclerview,version,multilingual,Android,Android Layout,Android Recyclerview,Version,Multilingual,我已经将默认语言设置为阿拉伯语(ar),它在我的阿尔卡特设备(版本6棉花糖)上按预期工作,但当我在三星设备(版本4.1.2 JellyBean)上运行此应用程序时,工具栏(顶部和底部)不会显示为RTL布局元素。查看下面两张图片 阿尔卡特视图运行良好 三星的观点并没有像预期的那样发挥作用 您可以在两台设备上看到顶部工具栏和底部工具栏的元素,但顺序不同。我有两个抽屉元素连接到顶部工具栏(左侧有带有Gravity Start的类别信息列表,右侧有带有Gravity End的用户帐户相关信息列表)
三星的观点并没有像预期的那样发挥作用 您可以在两台设备上看到顶部工具栏和底部工具栏的元素,但顺序不同。我有两个抽屉元素连接到顶部工具栏(左侧有带有
Gravity Start
的类别信息列表,右侧有带有Gravity End
的用户帐户相关信息列表)。所以他们在三星上表现得不太好
现在最后一件事是在屏幕区域,我有一个垂直的recyclerview
,根据可用数据显示不同的布局类型。三星电脑上这些布局的位置也不正确
注意:由于语言更改,recyclerview部分不起作用,当我用英语运行应用程序时,它也不同
编辑:我正在准备数据并设置嵌套回收视图的适配器类
package com.qemasoft.alhabibshop.app.controller;
import android.content.Context;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.qemasoft.alhabibshop.app.R;
import com.qemasoft.alhabibshop.app.Utils;
import com.qemasoft.alhabibshop.app.model.MyCategory;
import com.qemasoft.alhabibshop.app.model.MyItem;
import com.qemasoft.alhabibshop.app.model.MyPromotion;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import static com.qemasoft.alhabibshop.app.AppConstants.findStringByName;
import static com.qemasoft.alhabibshop.app.AppConstants.getHomeExtra;
/**
* Created by Inzimam on 17-Oct-17.
*/
public class MainFragmentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final static int CATEGORY_VIEW = 0;
private final static int PROMOTION_VIEW = 1;
private final static int ITEM_VIEW = 2;
private List<String> keysStrList;
private CategoryAdapter categoryAdapter;
private ItemAdapter itemAdapter;
private List<Object> myAllItemsList = new ArrayList<>();
private Context context;
private Utils utils;
public MainFragmentAdapter(List<String> keysList) {
this.keysStrList = keysList;
prepareData();
Log.e("AllItemTypeSize = ", myAllItemsList.size() + "");
}
@Override
public int getItemViewType(int position) {
Log.e("getItemViewType ", myAllItemsList.get(position).getClass() + "");
Object o = myAllItemsList.get(position);
if (o instanceof List) {
for (Object obj : (List) o) {
if (obj instanceof MyCategory) {
Log.e("InsideInstenceof", "Success");
return CATEGORY_VIEW;
}
}
return ITEM_VIEW;
} else if (o instanceof MyPromotion) {
return PROMOTION_VIEW;
} else {
return ITEM_VIEW;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder viewHolder;
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
Log.e("itemType = ", "ViewTypeOnCreate " + viewType);
switch (viewType) {
case CATEGORY_VIEW:
View v1 = inflater.inflate(R.layout.layout_main_frag_categories, parent, false);
viewHolder = new ViewHolder1(v1);
break;
case PROMOTION_VIEW:
View v2 = inflater.inflate(R.layout.discout_layout, parent, false);
viewHolder = new ViewHolder2(v2);
break;
default:
View v3 = inflater.inflate(R.layout.layout_main_frag_categories, parent, false);
viewHolder = new ViewHolder1(v3);
break;
}
this.context = parent.getContext();
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int itemType = holder.getItemViewType();
Log.e("itemType = ", itemType + "");
Object o = myAllItemsList.get(position);
RecyclerView.LayoutManager mLayoutManagerCat = null;
if (o instanceof List) {
List<Object> list = (List<Object>) myAllItemsList.get(position);
int layoutColumns = 2;
if (list.size() < 4) {
layoutColumns = 1;
}
mLayoutManagerCat =
new GridLayoutManager(context, layoutColumns,
LinearLayoutManager.HORIZONTAL, false);
}
switch (itemType) {
case CATEGORY_VIEW:
ViewHolder1 vh1 = (ViewHolder1) holder;
vh1.getmRecyclerView().setLayoutManager(mLayoutManagerCat);
vh1.getTitle().setText(findStringByName(keysStrList.get(position)));
vh1.getmRecyclerView().setAdapter(new CategoryAdapter(
(List<MyCategory>) myAllItemsList.get(position)));
break;
case PROMOTION_VIEW:
ViewHolder2 vh2 = (ViewHolder2) holder;
configureViewHolder2(vh2, position);
break;
default:
ViewHolder1 vh3 = (ViewHolder1) holder;
vh3.getmRecyclerView().setLayoutManager(mLayoutManagerCat);
vh3.getTitle().setText(findStringByName(keysStrList.get(position)));
vh3.getmRecyclerView().setAdapter(new ItemAdapter(
(List<MyItem>) myAllItemsList.get(position)));
break;
}
}
@Override
public int getItemCount() {
return keysStrList.size();
}
private void configureViewHolder2(ViewHolder2 vh2, int position) {
MyPromotion promotion = (MyPromotion) myAllItemsList.get(position);
if (promotion != null) {
vh2.getTitle().setText(promotion.getTitle());
vh2.getDescription().setText(promotion.getDescription());
}
}
private void prepareData() {
List<MyCategory> myCategoryList = new ArrayList<>();
List<MyItem> myItemList;
String responseStr = getHomeExtra();
try {
JSONObject responseObject = new JSONObject(responseStr);
Log.e("JSON_Response", "" + responseObject);
boolean success = responseObject.optBoolean("success");
if (success) {
JSONObject homeObject = responseObject.optJSONObject("home");
JSONObject modules = homeObject.optJSONObject("modules");
for (int a = 0; a < keysStrList.size(); a++) {
Log.e("KeyStr = ", keysStrList.get(a));
if (keysStrList.get(a).equals("categories")) {
JSONArray featuredCategories = modules.optJSONArray(keysStrList.get(a));
for (int i = 0; i < featuredCategories.length(); i++) {
JSONObject categoryObject = featuredCategories.getJSONObject(i);
MyCategory myCategory = new MyCategory(categoryObject.optString("category_id"),
categoryObject.optString("name"), categoryObject.optString("thumb"));
myCategoryList.add(myCategory);
}
myAllItemsList.add(myCategoryList);
} else if (keysStrList.get(a).equals("promotion")) {
JSONArray promotionArray = modules.optJSONArray("promotion");
JSONObject promotionObject = promotionArray.optJSONObject(0);
MyPromotion myPromotion = new MyPromotion(promotionObject.optString("id"),
promotionObject.optString("name"),
promotionObject.optString("description"));
myAllItemsList.add(myPromotion);
} else {
myItemList = new ArrayList<>();
JSONArray featuredProduct = modules.optJSONArray(keysStrList.get(a));
for (int i = 0; i < featuredProduct.length(); i++) {
JSONObject productObj = featuredProduct.getJSONObject(i);
MyItem myItem = new MyItem(productObj.optString("product_id"),
productObj.optString("name"), productObj.optString("dis"),
productObj.optString("price"), productObj.optString("thumb"));
myItemList.add(myItem);
}
myAllItemsList.add(myItemList);
}
}
} else {
Log.e("SuccessFalse", "Within getCategories");
}
} catch (JSONException e) {
e.printStackTrace();
Log.e("JSONEx_CatAdapterTest", responseStr);
}
}
public class GenericList<T> extends ArrayList<T> {
private Class<T> genericType;
public GenericList(Class<T> c) {
this.genericType = c;
}
public Class<T> getGenericType() {
return genericType;
}
}
}
package com.qemasoft.alhabibshop.app.controller;
导入android.content.Context;
导入android.support.v7.widget.GridLayoutManager;
导入android.support.v7.widget.LinearLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入com.qemasoft.alhabibshop.app.R;
导入com.qemasoft.alhabibshop.app.Utils;
导入com.qemasoft.alhabibshop.app.model.MyCategory;
导入com.qemasoft.alhabibshop.app.model.MyItem;
导入com.qemasoft.alhabibshop.app.model.MyPromotion;
导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.util.ArrayList;
导入java.util.List;
导入静态com.qemasoft.alhabibshop.app.AppConstants.findStringByName;
导入静态com.qemasoft.alhabibshop.app.AppConstants.getHomeExtra;
/**
*Inzimam于2017年10月17日创建。
*/
公共类MainFragmentAdapter扩展了RecyclerView.Adapter{
私有最终静态int类别_视图=0;
私有最终静态int升级_视图=1;
私有最终静态int项_视图=2;
私有列表键列表;
私有类别适配器类别适配器;
私有项适配器项适配器;
私有列表myAllItemsList=newArrayList();
私人语境;
私人公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业公用事业;
公共MainFragmentAdapter(列表键列表){
this.keystrlist=keysList;
prepareData();
Log.e(“AllItemTypeSize=,myAllItemsList.size()+”);
}
@凌驾
public int getItemViewType(int位置){
Log.e(“getItemViewType”,myAllItemsList.get(position.getClass()+”);
对象o=myAllItemsList.get(位置);
if(o instanceof List){
对于(对象对象对象:(列表)o){
if(MyCategory的obj实例){
Log.e(“内部指令”、“成功”);
返回类别视图;
}
}
返回项目视图;
}else if(o MyPromotion实例){
返回促销视图;
}否则{
返回项目视图;
}
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
RecyclerView.ViewHolder-ViewHolder;
LayoutInflater充气器=LayoutInflater.from(parent.getContext());
Log.e(“itemType=”,“ViewTypeOnCreate”+viewType);
开关(视图类型){
案例类别视图:
视图v1=充气机。充气(R.layout.layout\u main\u frag\u categories,parent,false);
viewHolder=新的ViewHolder1(v1);
打破
案例推广组观点:
视图v2=充气机。充气(R.layout.Discount_布局,父级,false);
viewHolder=新的ViewHolder2(v2);
打破
违约:
视图v3=充气机。充气(R.layout.layout\u main\u frag\u categories,parent,false);
viewHolder=新的ViewHolder1(v3);
打破
}
this.context=parent.getContext();
返回视图持有者;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
int itemType=holder.getItemViewType();
Log.e(“itemType=,itemType+”);
对象o=myAllItemsList.get(位置);
RecyclerView.LayoutManager mLayoutManagerCat=null;
if(o instanceof List){
List=(List)myAllItemsList.get(position);
int-layoutColumns=2;
if(list.size()<4){
layoutColumns=1;
}
mLayoutManagerCat=
新的GridLayoutManager(上下文、layoutColumns、,
LinearLayoutManager.HORIZONTAL,false);
}
开关(项目类型){
案例类别视图:
ViewHolder1 vh1=(ViewHolder1)支架;
vh1.getmRecyclerView().setLayoutManager(mLayoutManagerCat);
vh1.getTitle().setText(findStringByName(keystrlist.get(position));
vh1.getmRecyclerView().setAdapter(新类别适配器(
(列表)myAllItemsList.get(位置));
打破
案例推广组观点:
VIEWHOLDER2VH2=(ViewHolder2)支架;
配置ViewHolder2(vh2,位置);
打破
违约:
ViewHolder1 vh3=(ViewHolder1)支架;
vh3.getmRecyclerView().setLayoutManager(mLayoutManagerCat);
vh3.getTitle().setText(findStringByName(keystrlist.get(position));
vh3.getmRecyclerView().setA