小编Bhi*_*fer的帖子

Android:如何将click事件传播到LinearLayout子项并更改其drawable

我想创建一个线性布局,其行为与ImageButton类似.

<LinearLayout
    android:id="@+id/container"
    style="?WidgetHomeIconContainer">            

    <ImageView
        android:id="@+id/icon"
        style="?WidgetHomeIcon" />

    <TextView
        android:id="@+id/title"
        style="?WidgetHomeLabel"             
        android:text="@string/title"
        android:textAppearance="?attr/TextHomeLabel" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

在ImageView,TextView和LinearLayout的样式中,我为所有状态设置了一个选择器.

现在:

  • 当我点击ImageView(我也尝试使用ImageButton) - 它的行为正确并且图像根据选择器xml进行了更改.
  • 当我点击LinearLayout时 - 单击线性布局,但ImageView和TextView不会改变它的可绘制/外观

所以我想做以下几点.当我点击父LinearLayout时,我需要将它的所有子项更改为按下状态.

我尝试将以下代码添加到LinearLayout onClickListener以传播点击:

@Override
public void onClick(View v)
{
    LinearLayout l = (LinearLayout) v;
    for(int i = 0; i < l.getChildCount(); i++)
    {
        l.getChildAt(i).setClickable(true);
        l.getChildAt(i).performClick();
    }
}
Run Code Online (Sandbox Code Playgroud)

但它仍然保持相同的状态.非常感谢您的帮助.

android onclick android-linearlayout

19
推荐指数
2
解决办法
2万
查看次数

Android:使用支持片段管理器时复制片段

片段有一个非常奇怪的问题.我使用最新的支持库.我也使用Google在其IOSCHED项目中使用的类似代码

但是我在轮换后重新创建活动时遇到问题.在销毁并再次创建活动之后,我调用了用于管理片段事务的方法(在onStart方法中).这行只被调用一次,但它创建片段TWICE!

这是我的活动方法:

public abstract class SinglePaneActivity extends FragmentActivity
{
    @Override
    protected void onStart()
    {
        super.onStart();

        if(mFragment == null)
        {
            mFragment = onCreatePane();     
            mFragment.setArguments(Utils.intentToFragmentArguments(getIntent()));

            Log.w(TAG, "Fragment creation counter = " + createCounter);
            createCounter++;

            getSupportFragmentManager() 
            .beginTransaction()
            .add(R.id.root_container,mFragment)
            .commit();
        }
    }

    @Override
    protected void onStop()
    {
        Log.i(TAG, "onStop");
        if(mFragment != null)
        {
            getSupportFragmentManager()
            .beginTransaction()
            .remove(mFragment)
            .commit();

            mFragment = null;
        }
        super.onStop();
    }
}
Run Code Online (Sandbox Code Playgroud)

和我的日志:

--Start of application--
11-18 13:26:37.050: I/SinglePaneActivity(19040): onCreate
11-18 13:26:37.050: I/SinglePaneActivity(19040): onStart
11-18 13:26:37.055: W/SinglePaneActivity(19040): replacing fragment, …
Run Code Online (Sandbox Code Playgroud)

lifecycle android fragment android-lifecycle android-activity

12
推荐指数
1
解决办法
9840
查看次数

测试应用中的存储访问框架

我正在使用Intent.ACTION_OPEN_DOCUMENT_TREE授予我的应用程序对外部存储的写访问权限(在Lollipop和Marshmallow上).

但我想在测试应用程序中写入外部存储.Intent.ACTION_OPEN_DOCUMENT_TREE使用系统对话框,因此我无法在测试期间授予权限.我也尝试在应用程序中允许它,然后在测试中使用它但不共享 - 应用程序项目和测试项目是不同的包.

有没有人知道一些可能的解决方法,例如为测试目的授予整个外部存储的许可?也许通过改变一些系统属性?

adb shell setprop SOMEPROPERTY 1

testing android android-external-storage storage-access-framework

9
推荐指数
1
解决办法
596
查看次数

Android 6中的滚动条触控区域

我观察到Android 6.0 Marshmallow中的新行为.滚动条的触摸区域比滚动条更干净.它在以下屏幕截图中可见.滚动条有20 dp(绿色区域),触摸区域可能是48 dp(蓝色和绿色区域).我想只在滚动条上方设置触摸区域:

滚动条截图

我使用以下:

<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="MyTheme.Dark" parent="android:Theme.Black">
        <item name="android:fastScrollStyle">@style/Widget.FastScroll</item>
        <item name="android:scrollbarThumbVertical">@drawable/dark_scrollbar_thumb</item>
        <item name="android:scrollbarTrackVertical">@drawable/dark_scrollbar_track</item>
        <item name="android:scrollbarSize">4dp</item>
        <item name="android:fastScrollThumbDrawable">@drawable/dark_scrollbar_fast_thumb</item>
        <item name="android:fastScrollTrackDrawable">@drawable/dark_scrollbar_fast_track</item>
    </style>

    <style name="Widget.FastScroll" parent="android:Widget.Material.FastScroll">
    </style>

</resources>
Run Code Online (Sandbox Code Playgroud)

dark_scrollbar_fast_thumb.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <shape>
            <size
                android:height="30dp"
                android:width="20dp" />

            <solid android:color="@android:color/transparent" />
        </shape>
    </item>

    <item android:left="8dp" android:right="8dp">
        <shape>
            <size
                android:height="30dp"
                android:width="4dp" />

            <solid android:color="@color/dark_secondary" />
        </shape>
    </item>

</layer-list>
Run Code Online (Sandbox Code Playgroud)

dark_scrollbar_fast_track.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <size android:width="@dimen/1dp" />
    <solid android:color="@color/dark_scrollbar_track" />

</shape>
Run Code Online (Sandbox Code Playgroud)

dark_scrollbar_fast_thumb.xml:

<item>
    <shape>
        <size
            android:height="30dp" …
Run Code Online (Sandbox Code Playgroud)

android scrollbar android-styles android-6.0-marshmallow

7
推荐指数
1
解决办法
1177
查看次数

Android:如何通过MTP连接时检测MediaStore中的更改

我对MediaStore有很大的问题.当MediaStore通过MTP进行更改时,我需要处理事件.我已经有一个接收器用于android.intent.action.MEDIA_SCANNER_FINISHED操作,但它仅对通用大容量存储(UMS)有用.扫描程序不通过MTP启动,因为MTP直接更改了MediaStore数据库.

请你如此善良,帮助我如何发现这一事件.非常感谢您的帮助!

events android action mediastore mtp

5
推荐指数
2
解决办法
8013
查看次数

某些设备不存在Uri content:// media / external / file

我的某些设备有问题。我无法在任何设备上复制它,但是有些用户报告了很多崩溃报告。

这是例外:

java.lang.IllegalArgumentException: Unknown URL content://media/external/file
    at android.content.ContentResolver.delete(ContentResolver.java:1024)
Run Code Online (Sandbox Code Playgroud)

我用这个:

context.getContentResolver()。delete(MediaStore.Files.getContentUri(“ external”),MediaStore.Files.FileColumns.DATA +“ =?”,新的String [] {path});

之后,我调用MediaScannerConnection.scanFile()文件的父目录,因为这是如何通知MediaScanner有关文件删除以及如何刷新MTP内容的最有效的方法。我尝试了在stackoverflow上找到的所有其他方式(例如,Android如何使用MediaScannerConnection scanFile),但没有任何一种方法能达到这个目的。

顺便说一句。我仅将其用于API 11及更高版本。肯定安装了外部存储。

我有以下问题:1.您知道发生此异常的任何原因吗?我不想只是忽略异常。而且,当大多数设备都能正常运行时,我也不想删除此代码。2.您知道一些新的可靠方法,如何在删除某些文件时通知MediaScanner,以及如何立即刷新MTP的内容吗?

file-io android mediastore android-mediascanner

5
推荐指数
1
解决办法
16万
查看次数

Android:ListFragment中的ListView项重叠在自身上

我正在用ListFragments解决一个奇怪的问题.我有一个简单的FragmentActivity与一个FrameLayout女巫是我的ListFragment的容器.我使用自定义适配器来获取数据.在我旋转设备以改变方向之前,所有东西都在抛光.之后,列表视图被显示两次 - 一个列表与第二个列表重叠.当我滚动列表时,只有一个列表正在移动,它会创建如图所示的人工制品.

来自模拟器的截图

我在onCreateActivity中初始化适配器,我在onDestroy方法中没有做任何事情.我在onDestroy方法中应该做些什么来清除列表.你有没有遇到过这个问题?我真的不知道该怎么做.

谢谢!

android android-listview android-fragments

4
推荐指数
1
解决办法
1874
查看次数

Android:字符串集首选项不是持久的

我有存储字符串集首选项的问题.我有这些实用方法用于存储:

public static void putStringSet(SharedPreferences pref, Editor e, String key, Set<String> set)
{
    if (Utils.isApiLevelGreaterThanGingerbread())
    {
        // e.remove(key); // I tried to remove it here
        e.putStringSet(key, set);
    }
    else
    {
        // removes old occurences of key
        for (String k : pref.getAll().keySet())
        {
            if (k.startsWith(key))
            {
                e.remove(k);
            }
        }

        int i = 0;
        for (String value : set)
        {
            e.putString(key + i++, value);
        }
    }
}

public static Set<String> getStringSet(SharedPreferences pref, String key, Set<String> defaultValue)
{
    if (Utils.isApiLevelGreaterThanGingerbread())
    {
        return pref.getStringSet(key, …
Run Code Online (Sandbox Code Playgroud)

string android preferences

3
推荐指数
1
解决办法
5372
查看次数

确定功能模板中的类型

我想请教您关于功能模板的建议.我有一个功能,可以将一些数据添加到缓冲区.但我还需要将有关数据类型的信息添加到缓冲区中.数据类型是以下枚举:

enum ParameterType
{
   UINT,
   FLOAT,
   DOUBLE
};
Run Code Online (Sandbox Code Playgroud)

我需要从这样的函数创建一个函数模板:

void SomeBuffer::append( double par )
{
    appendType( DOUBLE );
    memcpy( pStr + _length, &par, sizeof( double ) );
    _length += sizeof( double );
    appendType( DOUBLE );
}
Run Code Online (Sandbox Code Playgroud)

你能否告诉我如何根据参数类型从ParameterType传递appendType()的值.

template<class T>
void SomeBuffer::append( T par )
{    
    appendType( ??? );
    memcpy( pStr + _length, &par, sizeof( T ) );
    _length += sizeof( T );
    appendType( ??? );
}
Run Code Online (Sandbox Code Playgroud)

我尝试用一​​些宏来做但没有成功.非常感谢您的任何建议.

c++ macros templates function-templates

2
推荐指数
1
解决办法
305
查看次数