我正在阅读关于Android M中新Permissions模型的官方文档.它讨论了如果应用程序先前已请求此权限并且用户拒绝该请求shouldShowRequestPermissionRationale()
,则返回的函数true
.如果用户过去拒绝了权限请求并选择了"不再询问"选项,则此方法返回false
.
但是我们如何区分以下两种情况呢?
案例1:该应用程序没有权限,之前未向用户询问过该权限.在这种情况下,shouldShowRequestPermissionRationale()将返回false,因为这是我们第一次询问用户.
情况2:用户已拒绝该权限并选择"不再询问",在这种情况下,shouldInShowRequestPermissionRationale()也将返回false.
我想将用户发送到案例2中的应用程序设置页面.我如何区分这两种情况?
我想在带有自定义样式的 AlertDialog 中显示一个单选列表,例如 .
所以我创建了一个自定义主题并将其作为参数提供给 AlertDialog.Builder 的构造函数。
这是显示对话框的代码:
private void showSortDialog() {
final CharSequence[] options = new String[] {"Relevance", "Newest"};
AlertDialog.Builder builder = new AlertDialog.Builder(getActivityReference(),
R.style.RadioDialogTheme);
builder.setTitle("Sort by");
builder.setSingleChoiceItems(options, -1, new DialogInterface.OnClickListener() {
. . . .
builder.create().show();
}
Run Code Online (Sandbox Code Playgroud)
这是样式:
<style name="RadioDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:textColorAlertDialogListItem">@drawable/radiobutton_textcolor_selector
</item>
<item name="android:listChoiceIndicatorSingle">@drawable/apptheme_btn_radio_holo_light
</item>
</style>
Run Code Online (Sandbox Code Playgroud)
我能够找到我在样式中添加的几个属性,以根据它们的状态更改单选按钮/文本的颜色。但我无法自定义文本外观(我想更改大小、提供填充等)。
我确定有一些属性可以用来设置文本的样式,但我找不到它。任何人都可以帮我解决这个问题吗?谢谢。
所以我有两个不同的Drawables
需要合并并Drawable
在运行时获得一个.我希望第一个Drawable
位于顶部,另一个位于底部.我遇到了LayerDrawable
它,看起来它正是我所需要的,但我在努力安排它时遇到了麻烦Drawables
.
所以我有一个ImageButton
48x48 dp
,这是最终Drawable
的结果.第一个Drawable
是加号按钮(20x20 dp
),第二个是dp
加号按钮下方的小点(4x4 ).
加号按钮Drawable
使用字体字形加载.我正在Drawable
使用这个xml片段创建点按钮:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid
android:color="@color/white_40"/>
<size
android:width="4dp"
android:height="4dp"/>
</shape>
Run Code Online (Sandbox Code Playgroud)
我的第一种方法是只既能补充Drawables
到LayerDrawable
,但是当我这样做,宽度/高度在XML中指定的点被忽略的属性,并将其延伸到覆盖的加号图标.
LayerDrawable finalDrawable = new LayerDrawable(new Drawable[] {plusIcon, dotIcon});
Run Code Online (Sandbox Code Playgroud)
我尝试的第二种方法是setLayerInset
尝试定位两者Drawables
.
LayerDrawable finalDrawable = new LayerDrawable(new Drawable[] {plusIcon, dotIcon});
finalDrawable.setLayerInset(0, 0, 0, 0, 0);
finalDrawable.setLayerInset(1, dp(22), dp(44), dp(22), 0);
Run Code Online (Sandbox Code Playgroud)
上面的代码片段最终将点放在正确的位置,但它也开始影响加号按钮的位置和大小,最终看起来像这样: …
android drawable android-layout android-drawable layerdrawable
我正在尝试使用回收器视图并处理单击事件.我已经阅读了在回收站视图项上处理onClick事件的各种方法,例如:
所以我的第一个问题是哪个选项更好?我目前正在使用第一种方法,如果在视图持有者类中定义单击侦听器本身就是方法,那么如何使用适配器中的上下文,因为视图持有者类是静态的.
基本上,我想拥有一个静态视图持有者,并且在click事件上,打开一个我需要上下文的新Activity.
更新:添加适配器和ViewHolder代码.
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private Context mContext;
private List<Job> jobs;
public MyAdapter(Context context, List<Job> jobs) {
mContext = context;
this.jobs = jobs;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemLayoutView = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.list_item, viewGroup, false);
itemLayoutView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext, MyActivity.class);
mContext.startActivity(intent);
}
});
return new ViewHolder(itemLayoutView);
}
@Override
public void onBindViewHolder(WorkExperienceAdapter.ViewHolder viewHolder, int i) {
//bindViewHolder code
} …
Run Code Online (Sandbox Code Playgroud) 我正在PagerSnapHelper
水平使用RecyclerView
以实现类似行为的视图寻呼机。
final PagerSnapHelper pagerSnapHelper = new PagerSnapHelper();
pagerSnapHelper.attachToRecyclerView(recyclerView);
它工作得很好,但我希望能够在用户向任一方向更改页面时获得回调。所以像,onSwipeLeft
/onSwipeRight
回调。
我尝试使用findTargetSnapPosition
in PagerSnapHelper
,但这只会给我targetIndex
而不是当前索引。我尝试过这样的事情,但它并不是一直有效。
@Override
public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {
final int targetPos = super.findTargetSnapPosition(layoutManager, velocityX, velocityY);
final View currentView = findSnapView(layoutManager);
final int currentPos = layoutManager.getPosition(currentView);
if (currentPos < targetPos) {
callback.onSwipeRight();
} else if (currentPos > targetPos) {
callback.onSwipeLeft();
}
return targetPos;
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现这一目标并始终有效?谢谢!
android android-support-library android-recyclerview pagersnaphelper