記事ディレクトリ
1.レイアウトの位置を動的に制御します
開発中に、同じアクティビティ内の異なるインターフェイスでレイアウトの位置を変更して、レイアウトをより適切な位置にする必要がある場合があります。
例えば:イベントのメインインターフェースでユーザーに没入感を与えてもらいたいので、レイアウトをシステムバーに拡張しますが、設定(フラグメント)インターフェースに切り替えると、発生する可能性が非常に高くなります。アイコン、インターフェイスのタイトルバーの一部のボタンがブロックされている状況。この問題を解決するには、コード内のレイアウト位置を制御する必要があります。
コード表示:
FrameLayout.LayoutParams layoutParams;
layoutParams=(FrameLayout.LayoutParams) view.findViewById(R.id.choose_layout).getLayoutParams();
if(getActivity() instanceof WeatherActivity){
//动态控制布局的margin属性
layoutParams.topMargin=50;
}
2.ラジオボタンの使用
開発中、ユーザーは特定の機能を有効にするか無効にするかを選択するように求められることがよくあります。現時点では、この機能を実現するには、より美しいコントロールが必要です。
エフェクト表示:
コード表示:
//声明依赖
dependencies {
implementation 'com.github.zcweng:switch-button:0.0.3'
}
//布局文件中用法
<com.suke.widget.SwitchButton
android:id="@+id/switch_button"
android:layout_gravity="center"
android:layout_marginLeft="60dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
//逻辑文件中用法
switchButton.setChecked();//设置控件的开关状态
switchButton.setOnCheckedChangeListener(new SwitchButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(SwitchButton view, boolean isChecked) {
//点击事件
if(isChecked==true){
//当控件变为true时的逻辑代码
}else if(isChecked==false){
//当控件变为false时的逻辑代码
}
}
});
3.必要な場合にのみレイアウトを表示する
開発中、最初にレイアウトの一部を非表示にしてから、ユーザーが操作を実行するときにレイアウトのこの部分を表示する必要がある場合があります。この機能を実現するために、2つの方法を紹介し、その長所と短所を指摘します。
3.1レイアウトの表示属性を制御する
ユーザーがこの機能を簡単に実現するための操作を実行した後、最初に非表示レイアウトのvisibleプロパティをView.GONEに設定し、次にvisibleプロパティをView.VISIBLEに設定する必要があります。
3.2ViewStub
ViewStubコントロールを使用して、この機能を実現することもできます。
コード表示:
//待隐藏布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/edit_extra1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:hint="Extra field 1" />
<EditText
android:id="@+id/edit_extra2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:hint="Extra field 2" />
<EditText
android:id="@+id/edit_extra3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:hint="Extra field 3" />
</LinearLayout>
//主界面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:hint="@string/edit_something_here" />
<Button
android:id="@+id/more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="20dp"
android:layout_marginBottom="10dp"
android:text="More" />
<ViewStub
android:id="@+id/view_stub"
android:layout="@layout/profile_extra"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
//逻辑代码
private EditText editExtra1;
private EditText editExtra2;
private EditText editExtra3;
public void onMoreClick() {
//当我们点击more按钮时执行该函数,即可是实现隐藏布局的显示
ViewStub viewStub = (ViewStub) findViewById(R.id.view_stub);
if (viewStub != null) {
View inflatedView = viewStub.inflate();
editExtra1 = (EditText) inflatedView.findViewById(R.id.edit_extra1);
editExtra2 = (EditText) inflatedView.findViewById(R.id.edit_extra2);
editExtra3 = (EditText) inflatedView.findViewById(R.id.edit_extra3);
}
3.3上記の2つの方法の長所と短所
最初の方法:
-
利点:シンプルなロジックと柔軟な制御。
-
短所:リソースを消費します。ビューは最初はView.GONEに表示されますが、Inflateがレイアウトされている場合、ビューは引き続きInflateになります。つまり、オブジェクトは引き続き作成され、インスタンス化され、属性が設定されます。つまり、メモリなどのリソースを消費します。
2番目の方法:
-
利点:Inflateがレイアウトされている場合、ViewStubのみが初期化され、ViewStubが表示されるように設定されている場合、またはViewStub.inflate()が呼び出されている場合、ViewStubが向けられるレイアウトはInflateされてインスタンス化され、その後インスタンス化されます。 ViewStubのレイアウトプロパティは、それが指すレイアウトに渡されます。このように、ViewStubを使用して、実行時にレイアウトを便利に表示できます。これにより、メモリリソースが節約され、レイアウトの最適化が実現されます。
-
機能:ViewStubは一度だけ膨張でき、その後ViewStubオブジェクトはnullに設定されます。つまり、ViewStubで指定されたレイアウトがInflateになると、ViewStubで制御できなくなります。ViewStubはレイアウトファイルの膨張にのみ使用でき、特定のビューでは使用できません。もちろん、Viewを次のように書き込むこともできます。レイアウトファイル内。
-
短所:プログラムの実行中、再起動しない限り、特定のレイアウトは膨張後に変更されません。つまり、ロードされたレイアウトを非表示にすることはできなくなります。ビューではなく、表示と非表示のみを制御できるのはレイアウトファイルです。
4.ImageViewが表示する画像を特定します
開発中に、ImageViewによって表示される画像に基づいて、実行するクリックイベントを決定する場合があります。この機能を実現するには、ImageViewが最初に表示する画像を決定する必要があります。
コード表示:
moreImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(moreImage.getDrawable().getCurrent().getConstantState().equals(ContextCompat.getDrawable(SettingActivity.this,R.drawable.many).getConstantState())){
//判断方法
//具体逻辑
}else {
//具体逻辑
}
}
});
5.ラジオボタンの使用
開発中に、ユーザーが1つを選択するための一連のオプションを提供する必要がある場合があります。この機能を実現するには、ラジオボタンコントロールを使用する必要があります。
コード表示:
//布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RadioGroup
android:id="@+id/radio_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/eight_time"
android:layout_margin="10dp"
android:text="8小时"
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RadioButton
android:id="@+id/four_time"
android:layout_margin="10dp"
android:text="4小时"
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RadioButton
android:id="@+id/two_time"
android:layout_margin="10dp"
android:text="2小时"
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RadioButton
android:id="@+id/one_time"
android:layout_margin="10dp"
android:text="1小时"
android:textSize="20sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RadioGroup>
</LinearLayout>
//逻辑代码
radioGroup.check();//设置哪一单选框为选中状态
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
//点击事件
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
switch (i){
case R.id.eight_time:
//选中后的逻辑代码
break;
case R.id.four_time:
//选中后的逻辑代码
break;
case R.id.two_time:
//选中后的逻辑代码
break;
case R.id.one_time:
//选中后的逻辑代码
break;
default:
}
}
}
6.RecyclerViewはスライド削除を実装します
開発では、サイドスリップRecyclerViewの特定のサブアイテムレイアウトを実装して、その機能を削除する必要がある場合があります。
次のコードでは、RecyclerViewの基本的な実装方法が省略されています。読者が明確でない場合は、ここに移動してください。
コード表示:
//为RecycleView绑定触摸事件
ItemTouchHelper helper=new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
//首先回调的方法 返回int表示是否监听该方向
int dragFlags = ItemTouchHelper.UP|ItemTouchHelper.DOWN;//拖拽
int swipeFlags = ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;//侧滑删除
return makeMovementFlags(dragFlags,swipeFlags);
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
//滑动事件
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
//侧滑事件
nameList.remove(viewHolder.getAdapterPosition());
myAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
});
helper.attachToRecyclerView(recyclerView);
注意:サイドスリップイベントでデータベースの内容を削除する必要がある場合は、remove関数の前に配置してください。そうしないと、getAdapterPosition()の戻り値が変更されます。
7.アクティビティでRecyclerViewのクリックイベントを処理します
RecyclerViewのクリックイベントを処理する場合、アクティビティ内の一部のデータが使用される可能性が非常に高くなります。通常、RecyclerViewのクリックイベントはアダプターに登録されているため、クリックイベントに何かを実装できない場合があります。いくつかの機能。アクティビティでクリックイベントを処理する問題を解決するために、コールバックインターフェイスを使用して達成できます。
コード表示:
//定义接口
public interface OnItemClickListener {
void onItemClick(int position);
}
//在适配器的点击事件中调用该接口中的方法
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<Saved> list=new ArrayList<>();
private OnItemClickListener Listener=null;
public MyAdapter(List<Saved> list, OnItemClickListener Listener){
//我们还需要在构造方法传入该接口
this.Listener=Listener;
this.list=list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, final int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item,parent,false);
final ViewHolder viewHolder=new ViewHolder(view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Listener.onItemClick(viewHolder.getAdapterPosition());//调用接口中的方法
}
});
return viewHolder;
}
......
}
//在活动中实现该接口中的方法
OnItemClickListener recyclerListener=new OnItemClickListener() {
@Override
public void onItemClick(int position) {
//具体逻辑代码
}
};