目录
1. Button
(1)样式
改变Btutton样式可以通过设置控件background和backgroundTint、foreground(前景色会覆盖文字)引用响应的selector文件,设置按下和普通状态下的样式。
(2)事件处理
方式一 原生回调方法:
onClick() 点击事件
setOnLongClickListener( ) 长按事件
setOnTouchListener( ) 触摸事件
方式二 自定义方法 在xml文件里写然后创建自定义方法。
2. EditText
一些属性:
<EditText
android:layout_width="200dp"
android:layout_height="100dp"
android:hint="请输入"
android:textColorHint="@color/purple_200"
android:inputType="numberPassword"
android:drawableLeft="@drawable/ic_baseline_emoji_people_24"
android:drawablePadding="20dp"
android:background="@color/black"/>
3.ImageView
<ImageView
android:src="@drawable/rick1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxHeight="400dp"
android:maxWidth="300dp"
android:adjustViewBounds="true"/>
4.ProgressBar
<ProgressBar
android:id="@+id/pb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:max="100"
android:progress="50"
android:indeterminate="true"
>
</ProgressBar>
5. ToolBar
<androidx.appcompat.widget.Toolbar
android:id="@+id/tb"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/purple_700"
app:navigationIcon="@drawable/ic_baseline_arrow_back_ios_24"
app:title="标题"
app:titleTextColor="@color/white"
app:titleMarginStart="100dp"
app:subtitle="子标题"
app:subtitleTextColor="@color/white"
app:logo="@drawable/rick1"
></androidx.appcompat.widget.Toolbar>
6. AlertDialog
public void wqClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.ic_launcher);
builder.setTitle("我是对话框");
builder.setMessage("今天天气怎么样?").
setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("wq", "onClick: 确定");
}
}).
setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("wq", "onClick: 取消");
}
}).
setNeutralButton("中间", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.e("wq", "onClick: 中间");
}
});
builder.create().show();
}
还可以设置setView
7.PopUpWindow
@SuppressLint("InflateParams") View popView = getLayoutInflater().inflate(R.layout.popwindow, null);
PopupWindow popupWindow = new PopupWindow(popView, ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT,false);
popupWindow.showAsDropDown(view,100,100);
8. ListView
9. RecycleView
10. 动画
(1)逐帧动画
就是一张张的图片快速切换。
实现:通过animation-list 添加item及持续时间。
main_activity中:
java代码中调用:
(2)补间动画
主要是图片的状态变化。
(3)动画属性
11. ViewPager
首先创建三个layout
创建viewPager
<androidx.viewpager.widget.ViewPager
android:id="@+id/vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
></androidx.viewpager.widget.ViewPager>
为ViewPage创建适配器
public class MyAdapter extends PagerAdapter {
// 存放数据
private List<View> mListView;
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
container.addView(mListView.get(position),0);
return super.instantiateItem(container, position);
}
public MyAdapter(List<View> viewList){
this.mListView = viewList;
}
public List<View> getmListView() {
return mListView;
}
public void setmListView(List<View> mListView) {
this.mListView = mListView;
}
// webpage中有多少个view
@Override
public int getCount() {
return mListView.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(mListView.get(position));
}
}
MainActivity代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建view的集合
LayoutInflater lf = getLayoutInflater().from(this);
View view1 = lf.inflate(R.layout.layout1,null);
View view2 = lf.inflate(R.layout.layout2,null);
View view3 = lf.inflate(R.layout.layout3,null);
List<View> viewList = new ArrayList<>();
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
// 获取ViewPage
View viewPger = findViewById(R.id.vp);
MyAdapter myAdapter = new MyAdapter(viewList);
}
}
12. Fragment
特点:
1. 具备自己的生命周期
2. 必须委托在activity中才能运行
3. 一个Acitivity中可以使用多个Fragment,一个Fragment也可以在多个Activity中使用。Activity中也可以在运行中动态的增加/删除。
创建两个Fragment并在MainActivity中引用:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
tools:context=".BlankFragment1"
android:orientation="vertical"
>
<!-- TODO: Update blank fragment layout -->
<TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="@string/hello_blank_fragment"/>
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="button"
></Button>
</LinearLayout>
BlankFragment1.java
package com.wq.learning;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class BlankFragment1 extends Fragment {
private View root;
private TextView textView;
private Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
/**
* 和 Activity 不同的是,不能直接在onCreate函数中setContentView,
* 而是要在onCreateView函数中创建解析器。
* 和Acivity一样 可以响应各种事件。
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (root == null)
root = inflater.inflate(R.layout.fragment_blank1,container,false);
textView = root.findViewById(R.id.textview);
button = root.findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.setText("set text");
}
});
return root;
}
}
main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity">
<fragment android:name="com.wq.learning.BlankFragment1"
android:id="@+id/fragment1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
></fragment>
<fragment android:name="com.wq.learning.BlankFragment1"
android:id="@+id/fragment2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
></fragment>
</LinearLayout>
动态管理Fragment
1. 在main_activity.xml中添加两个用来切换的button和装fragment的framelayout
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btn" android:text="change" ></Button> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btn2" android:text="replace" ></Button> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/framelayout" android:background="@color/purple_700" ></FrameLayout>
2. 分别创建两个Fragment
3. MainActivity中:
package com.wq.learning; import android.os.Bundle; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button button1; Button button2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = findViewById(R.id.btn); button2 = findViewById(R.id.btn2); button1.setOnClickListener(this); button2.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn: replaceFrament(new BlankFragment1()); case R.id.btn2: replaceFrament(new BlankFragment2()); } } private void replaceFrament(Fragment blankFragment) { // 获取默认的fragment管理类 FragmentManager fragmentManager = getSupportFragmentManager(); // 拿到管理类的触发器 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); // 把fragment1替换成framelayout里。 fragmentTransaction.replace(R.id.framelayout, blankFragment); // 事务提交 fragmentTransaction.commit(); } }
4. 如何将所有的Fragment添加到一个栈中?(可以依次返回)
在commit之前添加: transaction,addToBackStack(null);
动态管理Fragment的总结:
Activity与Fragment通信
原生方法:Bundle 一个独立的类,数据载体。
上述代码中的activity和fragment1如何进行通信的?
@Override public void onClick(View v) { switch (v.getId()){ case R.id.btn: // 创建bundle Bundle bundle = new Bundle(); bundle.putString("message","呵呵"); BlankFragment1 blankFragment1 = new BlankFragment1(); blankFragment1.setArguments(bundle); replaceFrament(blankFragment1); case R.id.btn2: replaceFrament(new BlankFragment2()); } }
在BlankFragment1.java中:
任何地方都可以使用传递的信息。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 拿到相应Activity的bundle Bundle bundle = getArguments(); bundle.getString("message");
}
第二种方法:建立接口