先上效果图,由于字数问题,后续会可能会出三
图一是在android 实现默认标题和自定义标题一的基础上修改的
android 实现默认标题和自定义标题一_安卓开发中如何设置标题-CSDN博客
我们先实现图一的效果,如果没有看自定义标题一的,建议先看一下
我们是使用的自定义标题不是系统默认的,所以说
AndroidManifest.xml这个文件如果是使用系统默认的就需要该,是自定义的就不需要改
1. SettingsActivity.java 这个类 我们有所改动,把标题变成了透明的,多说无意上代码
public class SettingsActivity extends FragmentActivity {
MainActivityUtlis mainActivityUtlis = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
mainActivityUtlis = new MainActivityUtlis();
final Toolbar toolbar = findViewById(R.id.action_bar);
if (toolbar != null) {
toolbar.setVisibility(View.VISIBLE);
setActionBar(toolbar);//把获取到的资源 放进去
}
mainActivityUtlis.setToolbar(SettingsActivity.this,"设置");
}
2. MainActivityUtlis.java是我的一个工具类,就放出来你们需要的这个方法
/**
* 设置状态栏文字颜色和透明
*/
public void status_bar(Activity activity) {
try {
Window window = activity.getWindow();
//设置状态栏文字色为深色,页面内容全屏
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
//设置状态栏背景色为透明
window.setStatusBarColor(Color.TRANSPARENT);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 设置工具栏、状态栏文字颜色和透明
*
* @param activity
* @param title
*/
public void setToolbar(Activity activity, String title) {
try {
ActionBar actionBar = activity.getActionBar();//获取资源有没有需要的Toolbar
if (actionBar != null) {
actionBar.setHomeButtonEnabled(true);//左上角 出现一个小箭头返回 是否可以点击
actionBar.setDisplayHomeAsUpEnabled(true);//左上角 出现一个小箭头返回
actionBar.setTitle(title);
actionBar.setDisplayShowTitleEnabled(true); //以显示标题
actionBar.setElevation(0); //支持视图之间的阴影和遮挡关系
}
status_bar(activity);
} catch (Exception e) {
Log.e(TAG, "setToolbar()" + e.getMessage());
e.printStackTrace();
}
}
如果getActionBar()报错了,去
3. R.layout.settings_activity 这个xml去看一下是不是 Toolbar 没有该过来,我这里使用到的还是自定义标题栏里面的
<LinearLayout
android:id="@+id/content_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:transitionGroup="true"
android:orientation="vertical">
<Toolbar
android:id="@+id/action_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="?android:attr/actionBarTheme" />
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
4. 然后关键的到了 SettingMya.java 这个类改动很大,前面的方法还是老样子。就把工具类初始化了
public class SettingMya extends SettingsActivity {
static MainActivityUtlis mainActivityUtlis = null;
private static final String TAG = "SettingMya";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainActivityUtlis = new MainActivityUtlis();
try {
if (savedInstanceState == null) {
getSupportFragmentManager()//打开另外一个片段
.beginTransaction()//打开事务
.replace(R.id.content_frame, new SettingsFragment())//先删除在添加 add()是添加
.commit();//添加
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 点击右上角的返回图片 就触发下面的方法
*
* @param item The menu item that was selected.
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
5.然后就到了关键的方法了 SettingsFragment.java 和root_preferences.xml里面使用到的图片都是在iconfont-阿里巴巴矢量图标库里面找的
public static class SettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
// addPreferencesFromResource(R.xml.root_preferences);
setPreferencesFromResource(R.xml.root_preferences, rootKey);
try {
Preference LogOut = findPreference("Log_out");
Preference prefAndroid = findPreference("prefAndroid");
Preference setting_name = findPreference("setting_name");
Preference clear_cache = findPreference("clear_cache");
CheckBoxPreference setting_no_img = findPreference("setting_no_img");
if (setting_no_img != null && setting_no_img.isChecked()) {
setting_no_img.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) {
final CustomEditTextDialog customDialog = new CustomEditTextDialog();
customDialog.setShowToast("功能未开放");
customDialog.show(requireActivity().getSupportFragmentManager(), "Function_not_open");
customDialog.setVisibility(View.GONE);
return false;
}
});
}
if (LogOut != null && clear_cache != null && prefAndroid != null && setting_name != null) {
LogOut.setOnPreferenceClickListener(this);
setting_name.setOnPreferenceClickListener(this);
clear_cache.setOnPreferenceClickListener(this);
prefAndroid.setOnPreferenceClickListener(this);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onPreferenceClick(@NonNull Preference preference) {
switch (preference.getKey()) {
case "Log_out":
final CustomEditTextDialog customDialog = new CustomEditTextDialog();
customDialog.setShowToast("是否退出登录");
customDialog.setOnClickListener(new CustomEditTextDialog.OnClickListener() {
@Override
public void onSureClick(View v) {
Intent intent = new Intent(getActivity(), MainActivity.class);
mainActivityUtlis.setObtain_status(requireContext(), false);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
requireActivity().finishAffinity();
}
@Override
public void onCancelClick(View v) {
mainActivityUtlis.showToast("取消", requireContext());
}
});
customDialog.show(requireActivity().getSupportFragmentManager(), "loginDialog");
break;
case "clear_cache":
Dialog loadingDialog = mainActivityUtlis.createLoadingDialog(requireContext(), "清除缓存中...");
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
mainActivityUtlis.closeDialog(loadingDialog);
mainActivityUtlis.getShowToast(requireActivity(), requireContext(), "清除缓存成功");
}
}, 1000);
break;
case "prefAndroid":
// ACTION_MAIN:(android.intent.action.MAIN)Android程序入口。
// ACTION_VIEW: (android.intent.action.VIEW) 显示指定数据。
// ACTION_EDIT: (android.intent.action.EDIT) 编辑指定数据。
// ACTION_DIAL: (android.intent.action.DIAL) 显示拨号面板。
// ACTION_CALL: (android.intent.action.CALL) 直接呼叫Data中所带的号码。
// ACTION_ANSWER: (android.intent.action.ANSWER) 接听来电。
// ACTION_SEND: (android.intent.action.SEND) 向其他人发送数据(例如:彩信/email)。
// ACTION_SENDTO: (android.intent.action.SENDTO) 向其他人发送短信。
// ACTION_SEARCH: (android.intent.action.SEARCH) 执行搜索。
// ACTION_GET_CONTENT: (android.intent.action.GET_CONTENT) 让用户选择数据,并返回所选数据
// CATEGORY_DEFAULT: (android.intent.category.DEFAULT) Android系统中默认的执行方式,按照普通Activity的执行方式执行。
// CATEGORY_HOME: (android.intent.category.HOME) 设置该组件为Home Activity。
// CATEGORY_PREFERENCE: (android.intent.category.PREFERENCE) 设置该组件为Preference。
// CATEGORY_LAUNCHER: (android.intent.category.LAUNCHER) 设置该组件为在当前应用程序启动器中优先级最高的Activity,通常与入口ACTION_MAIN配合使用。
// CATEGORY_BROWSABLE: (android.intent.category.BROWSABLE) 设置该组件可以使用浏览器启动。
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setClassName("com.tencent.mobileqq", "com.tencent.mobileqq.activity.JumpActivity");
intent.putExtra(Intent.EXTRA_TEXT, "获取信息成功");
intent.setType("text/*");//此处可发送多种文件
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_DEFAULT);
// 检查是否有能处理此Intent的应用
if (AppUtils.isAppInstalled("com.tencent.mobileqq")) {
startActivity(intent);
} else {
mainActivityUtlis.showToast("QQ未安装", requireContext());
}
break;
case "setting_name":
break;
}
return false;
}
}
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2017 360OS, All rights reserved. -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="qk_my_device_info_pref_screen"
android:title="@string/app_name">
<CheckBoxPreference
android:defaultValue="true"
android:icon="@drawable/no_graph_img"
android:key="setting_no_img"
android:summary="仅在WIFI环境下显示图片"
android:title="无图模式" />
<PreferenceCategory android:title="设置">
<Preference
android:icon="@drawable/uernam_img"
android:key="setting_name"
android:summary="小王"
android:title="名称" />
<Preference
android:icon="@drawable/qq_img"
android:key="prefAndroid"
android:summary="敢不敢试试"
android:title="获取qq" />
</PreferenceCategory>
<PreferenceCategory>
<Preference
android:icon="@drawable/cache_img"
android:key="clear_cache"
android:summary="清除过去缓存、释放空间"
android:title="清除缓存" />
<Preference
android:icon="@drawable/out_logo"
android:key="Log_out"
android:title="退出登录" />
</PreferenceCategory>
</PreferenceScreen>
6.SettingMya.java里面的
我们就使用到了最常用的 Preference 一些事件,如果看不懂,下面加上一份带注释的 SettingMya.java
public class SettingMya extends SettingsActivity {
static MainActivityUtlis mainActivityUtlis = null;
private static final String TAG = "SettingMya";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainActivityUtlis = new MainActivityUtlis();
try {
if (savedInstanceState == null) {
getSupportFragmentManager()//打开另外一个片段
.beginTransaction()//打开事务
.replace(R.id.content_frame, new SettingsFragment())//先删除在添加 add()是添加
.commit();//添加
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 点击右上角的返回图片 就触发下面的方法
*
* @param item The menu item that was selected.
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/**
* 允许你轻松地创建和管理复杂的设置界面,同时保持了对各种 Android 版本的兼容性。
*/
public static class SettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
// addPreferencesFromResource(R.xml.root_preferences);
setPreferencesFromResource(R.xml.root_preferences, rootKey);//该函数用于从指定的资源文件中加载偏好设置。其中,R.xml.root_preferences指定了资源文件的ID
try {
Preference LogOut = findPreference("Log_out");//它通过findPreference方法查找不同的偏好设置项 和 findViewById()使用方式差不多
Preference prefAndroid = findPreference("prefAndroid");
Preference setting_name = findPreference("setting_name");
Preference clear_cache = findPreference("clear_cache");
CheckBoxPreference setting_no_img = findPreference("setting_no_img");
/**
* 为 setting_no_img 设置一个监听器。当监听器的 onPreferenceChange 方法被调用时,会创建一个 CustomEditTextDialog 对话框并显示出来
*/
if (setting_no_img != null && setting_no_img.isChecked()) {
setting_no_img.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) {
final CustomEditTextDialog customDialog = new CustomEditTextDialog();
customDialog.setShowToast("功能未开放");
customDialog.show(requireActivity().getSupportFragmentManager(), "Function_not_open");
customDialog.setVisibility(View.GONE);
return false;
}
});
}
/**
* 在都不等于null的情况下,设置点击事件监听器
*/
if (LogOut != null && clear_cache != null && prefAndroid != null && setting_name != null) {
LogOut.setOnPreferenceClickListener(this);
setting_name.setOnPreferenceClickListener(this);
clear_cache.setOnPreferenceClickListener(this);
prefAndroid.setOnPreferenceClickListener(this);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 这个函数是用于处理用户在设置界面点击条目时的事件。具体来说,根据用户点击的条目不同,函数会执行不同的操作:
* 如果用户点击了"Log_out"条目,函数会弹出一个对话框,询问用户是否确定退出登录。如果用户点击确定,函数会启动一个跳转到MainActivity的Intent,清除登录状态,并结束当前Activity;如果用户点击取消,函数会显示一个Toast提示信息。
* 如果用户点击了"clear_cache"条目,函数会弹出一个加载中的对话框,并在1秒后关闭对话框,并显示一个Toast提示信息,告知用户缓存已清除成功。
* 如果用户点击了"prefAndroid"条目,函数会启动一个分享文本的Intent,将文本内容设置为"获取信息成功",并检查手机是否安装了QQ应用。如果已安装,函数会将Intent发送给QQ应用,否则会显示一个Toast提示信息。
* 如果用户点击了"setting_name"条目,还在做
*
* @param preference The preference that was clicked
* @return
*/
@Override
public boolean onPreferenceClick(@NonNull Preference preference) {
switch (preference.getKey()) {
case "Log_out":
final CustomEditTextDialog customDialog = new CustomEditTextDialog();
customDialog.setShowToast("是否退出登录");
customDialog.setOnClickListener(new CustomEditTextDialog.OnClickListener() {
@Override
public void onSureClick(View v) {
Intent intent = new Intent(getActivity(), MainActivity.class);
mainActivityUtlis.setObtain_status(requireContext(), false);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
requireActivity().finishAffinity();
}
@Override
public void onCancelClick(View v) {
mainActivityUtlis.showToast("取消", requireContext());
}
});
customDialog.show(requireActivity().getSupportFragmentManager(), "loginDialog");
break;
case "clear_cache":
Dialog loadingDialog = mainActivityUtlis.createLoadingDialog(requireContext(), "清除缓存中...");
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
mainActivityUtlis.closeDialog(loadingDialog);
mainActivityUtlis.getShowToast(requireActivity(), requireContext(), "清除缓存成功");
}
}, 1000);
break;
case "prefAndroid":
// ACTION_MAIN:(android.intent.action.MAIN)Android程序入口。
// ACTION_VIEW: (android.intent.action.VIEW) 显示指定数据。
// ACTION_EDIT: (android.intent.action.EDIT) 编辑指定数据。
// ACTION_DIAL: (android.intent.action.DIAL) 显示拨号面板。
// ACTION_CALL: (android.intent.action.CALL) 直接呼叫Data中所带的号码。
// ACTION_ANSWER: (android.intent.action.ANSWER) 接听来电。
// ACTION_SEND: (android.intent.action.SEND) 向其他人发送数据(例如:彩信/email)。
// ACTION_SENDTO: (android.intent.action.SENDTO) 向其他人发送短信。
// ACTION_SEARCH: (android.intent.action.SEARCH) 执行搜索。
// ACTION_GET_CONTENT: (android.intent.action.GET_CONTENT) 让用户选择数据,并返回所选数据
// CATEGORY_DEFAULT: (android.intent.category.DEFAULT) Android系统中默认的执行方式,按照普通Activity的执行方式执行。
// CATEGORY_HOME: (android.intent.category.HOME) 设置该组件为Home Activity。
// CATEGORY_PREFERENCE: (android.intent.category.PREFERENCE) 设置该组件为Preference。
// CATEGORY_LAUNCHER: (android.intent.category.LAUNCHER) 设置该组件为在当前应用程序启动器中优先级最高的Activity,通常与入口ACTION_MAIN配合使用。
// CATEGORY_BROWSABLE: (android.intent.category.BROWSABLE) 设置该组件可以使用浏览器启动。
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setClassName("com.tencent.mobileqq", "com.tencent.mobileqq.activity.JumpActivity");
intent.putExtra(Intent.EXTRA_TEXT, "获取信息成功");
intent.setType("text/*");//此处可发送多种文件
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_DEFAULT);
// 检查是否有能处理此Intent的应用
if (AppUtils.isAppInstalled("com.tencent.mobileqq")) {
startActivity(intent);
} else {
mainActivityUtlis.showToast("QQ未安装", requireContext());
}
break;
case "setting_name":
break;
}
return false;
}
}
}
然后这时候的效果是后报错的,因为 CustomEditTextDialog 是自定义的DialogFragment
图二就是标题说的自定义DialogFragment
先看他的 my_dialog,大概就是这样
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="270dp"
android:layout_height="wrap_content"
android:background="@drawable/background_view_rounded_single"
android:orientation="vertical">
<TextView
android:id="@+id/titles"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:layout_marginRight="15dp"
android:gravity="center_horizontal"
android:text="提示"
android:textColor="@color/text_black"
android:textSize="19sp" />
<TextView
android:id="@+id/titless"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="10dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="10dp"
android:gravity="center"
android:lineSpacingExtra="5dp"
android:text="内容"
android:textColor="@color/text_black"
android:textSize="19sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#DFDFDF" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:orientation="horizontal">
<TextView
android:id="@+id/dialog_confirm_cancle"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:clickable="true"
android:gravity="center"
android:text="@string/ok"
android:textColor="@color/text_red"
android:textSize="17sp" />
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="#DFDFDF" />
<TextView
android:id="@+id/dialog_confirm_sure"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:clickable="true"
android:gravity="center"
android:text="@string/cancel"
android:textColor="@color/text_blue"
android:textSize="17sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
package com.go.myapplicatio.utils;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;
import java.util.Timer;
import java.util.TimerTask;
public class CustomEditTextDialog extends DialogFragment {
private TextView btnSure;
private TextView btnCancle;
private TextView content;
private OnClickListener mListener;
String title1;
private int Visibility_state = View.VISIBLE;
private EditText editText;
public interface OnClickListener {
void onSureClick(View v);
void onCancelClick(View v);
}
/**
* 初始化
* @return
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.my_dialog, container);
content = (TextView) view.findViewById(R.id.titless);
content.setText(title1);
btnSure = (TextView) view.findViewById(R.id.dialog_confirm_sure);
btnCancle = (TextView) view.findViewById(R.id.dialog_confirm_cancle);
editText=(EditText)view.findViewById(R.id.edittext);
/**
* 取消
*/
btnSure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null) {
mListener.onCancelClick(v);
}
dismiss();
}
});
/**
* 确定
*/
btnCancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null) {
mListener.onSureClick(v);
}
dismiss();
}
});
return view;
}
public void setShowToast(String message) {
this.title1 = message;
}
/**
* 当对话框被创建时调用此方法。
* 在这里初始化对话框的样式,使其没有标题,并应用自定义的样式。
*
* @param savedInstanceState 如果对话框以前被保存过状态,这里将包含那个状态;否则为null。
*/
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置对话框风格为无标题,并应用自定义样式R.style.CustomDialog
setStyle(STYLE_NO_TITLE, R.style.CustomDialog);
}
/**
* 设置点击事件监听器。
*/
public void setOnClickListener(OnClickListener listener) {
mListener = listener;
}
}
<style name="CustomDialog" parent="@android:style/Theme.Dialog">
<!--这个说明提示框是否有边框-->
<item name="android:windowFrame">@null</item>
<!--这个说明提示框是否是浮动的-->
<item name="android:windowIsFloating">true</item>
<!--这个说明提示框是滞是透明的-->
<item name="android:windowIsTranslucent">false</item>
<!--这个说明提示框是否有标题-->
<item name="android:windowNoTitle">true</item>
<!--这个说明提示框的背景颜色是什么-->
<item name="android:windowBackground">@drawable/background_view_rounded_single</item>
<!--这个说明是否充许对话框的背景变暗。为true则充许变暗-->
<item name="android:backgroundDimEnabled">true</item>
</style>