精华内容
下载资源
问答
  • fragmen
    2021-11-03 20:38:33

    myfragment.xml

    <?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:gravity="center"
        android:orientation="vertical" >
     
        <TextView
            android:id="@+id/current_page"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
     
    </LinearLayout>

     主页面布局

    activity_main.xml 

    <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&#
    更多相关内容
  • Android中Fragmen的首选项可以使用自定义的ListPreference,这样Fragment的PreferenceFragment就可以更方便地保存配置信息,需要的朋友可以参考下
  • Fragmen与RecyclerView使用

    2017-11-30 18:35:41
    Fragmen与RecyclerView使用,recycleView精确使用,Fragmen与RecyclerView使用
  • Fragmen和Activity之间的通信Demo!配合博客使用!
  • viewpager+fragmen常用的一类,为初学者提供简单代码以供学习
  • Jetpack Navigation Fragmen间数据传递

    千次阅读 2021-01-31 14:33:57
    Jetpack Navigation Fragmen间数据传递   Navigation 是一个框架,用于在 Android 应用中的“目标函数”之间导航,该框架提供一致的 API,无论目标函数是作为 Fragment、Activity 还是其他组件实现。 需要...

    Jetpack Navigation Fragmen间数据传递

      Navigation 是一个框架,用于在 Android 应用中的“目标函数”之间导航,该框架提供一致的 API,无论目标函数是作为 Fragment、Activity 还是其他组件实现。

    需要传递数据的几种场景

    1. 页面迁移时需要从AFragment 将数据传递到BFragment.
    2. 页面回退时需要从BFragment 将数据传递到AFragment.

    页面迁移时的数据传递方式

      在开发中从AFragment迁移到BFragment时传递数据是非常常见的业务场景。

    • 直接通过Bundl传递数据:
     private void goBFragment() {
            Bundle args = new Bundle();
            args.putString("userName", "张三");
            Navigation.findNavController(getView())
            .navigate(R.id.action_AFragment_to_BFragment, args);
        }
    
    public final class BFragment extends Fragment{
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            String ueserName = getArguments().getString("userName");
        }
    }
    

      上面代码就可实现数据的传递与获取,但此方法需要双方协定好数据的Key 以及数据类型。一方的变更极易引发未知的问题。

    • 官方推荐的safeArgs数据传递方式:
    1. 在项目的根build.gradle下添加插件
     dependencies {
            classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.2"
        }
    
    1. 然后在Module的build.gradle 中依赖插件
     apply plugin: "androidx.navigation.safeargs"
    
    1. 在navigation.xml 中添声明需要传递的数据
     <fragment
            android:id="@+id/BFragment"
            android:name="org.alee.demo.navigation.back.BFragment"
            android:label="BFragment">
            <argument
                android:name="userName"
                app:argType="string"
                android:defaultValue="张三"
                />
        </fragment>
    
    1. 添加完后rebuild一下工程,safeArgs会自动生成一些代码
      在这里插入图片描述

    safeArgs会根据nav_graph中的fragment标签生成对应的类,action标签会以“类名+Directions”命名,argument标签会以“类名+Args”命名。

    1. 迁移页面并传递数据
     private void goBFragment() {
            Navigation.findNavController(getView())
            .navigate(AFragmentDirections.actionAFragmentToBFragment().setUserName("张三"));
        }
    
    1. 接收数据
    public final class BFragment extends Fragment {
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            String userName = BFragmentArgs.fromBundle(getArguments()).getUserName();
        }
    }
    

    无疑使用safeArgs进行Fragment 见数据传递时插件替我们管理了数据的Key与类型,使得更为安全方便。

    页面回退时的数据传递方式

      在导航业务中,要在算路结果页面(AFragment)跳转到地图拾取页面(BFragment)拾取一个点来作为途径地。此时BFragment 需要将拾取到的兴趣点传递给AFragment,但如果使用NavController.navigate()API 会导致重新创建了一个AFragment 并执行了onCreate()、onCreateView()、onViewCreated(),这是不符合我们需求的。我们希望BFragment仅是将处理后的结果传递给AFragment。

      在Fragment和Navigation中有没有像startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options)setResult(int resultCode, Intent data)这样的接口供我们使用呢?答案是否定的,目前Navigation还不支持popBackStack时将数据回传。但我们可以基于Navigation实现一个类似的接口。

    解决方案

    public abstract class BaseFragment extends Fragment {
        protected ResultArgs mArgs;
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            return inflater.inflate(requireLayoutId(), container, false);
        }
    
    
        protected abstract @LayoutRes
        int requireLayoutId();
    
        @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            mArgs = new ResultArgs(getArguments());
            onFindView(view);
            onBindListener();
        }
    
        protected abstract void onFindView(View rootView);
    
        protected abstract void onBindListener();
    
        protected void go(@IdRes int destination) {
            go(destination, null);
        }
    
        protected void go(@IdRes int destination, Bundle bundle) {
            getNavController().navigate(destination, bundle);
        }
    
        protected void back() {
            getNavController().popBackStack();
        }
    
        protected <T> void setResult(T data) {
            if (null == mArgs || 0 >= mArgs.getRecipientId()) {
                return;
            }
            getNavController().getBackStackEntry(mArgs.getRecipientId()).getSavedStateHandle().getLiveData(String.valueOf(mArgs.getRequestCode())).postValue(new Pair(mArgs.getRequestCode(), data));
        }
    
        /**
         * @param destination 要迁移到的页面
         * @param requestCode 与StartActivityForResult 的RequestCode 相同
         * @param <T>         返回数据类型
         * @return {@link LiveData} Pair.first: requestCode; Pair.second: resultData
         */
        protected <T> LiveData<Pair<Integer, T>> startFragmentForResult(@IdRes int destination, int requestCode) {
            return startFragmentForResult(destination, requestCode, null);
        }
    
        protected <T> LiveData<Pair<Integer, T>> startFragmentForResult(int requestCode, @NonNull NavDirections destination) {
            return startFragmentForResult(destination.getActionId(), requestCode, destination.getArguments());
        }
    
        protected <T> LiveData<Pair<Integer, T>> startFragmentForResult(@IdRes int destination, int requestCode, @Nullable Bundle bundle) {
            ResultArgs args = new ResultArgs(getNavController().getCurrentDestination().getId(), requestCode).setBusinessArgs(bundle);
            LiveData<Pair<Integer, T>> liveData = getNavController().getCurrentBackStackEntry().getSavedStateHandle().getLiveData(String.valueOf(requestCode));
            getNavController().navigate(destination, args.toBundle());
            return liveData;
        }
    
        protected void popTo(@IdRes int destination) {
            getNavController().popBackStack(destination, true);
        }
    
        protected NavController getNavController() {
            return Navigation.findNavController(getView());
        }
    }
    
    

    startFragmentForResult主要依赖于Navigation 提供的SavedStateHandle对象来持有一个LiveData,三个重载函数完美支持了所有跳转方式。返回一个具有生命周期感知能力的LiveData供接收返回的数据,这使得发起跳转的Fragment不会在非活跃状态接收到返回数据,在Fragment 销毁后会自动解除和观察者之间的绑定关系,以防止内存泄漏和过多的内存消耗。

    setResult 通过遍历NavController内部管理的回退栈找到要接收数据的Fragment对应的SavedStateHandle以及LiveData 将数据发射出去供订阅者接收。

    public class ResultArgs {
    
    
        private static final String RECIPIENT_ID = "resultArgsRecipientId";
    
        private static final String REQUEST_CODE = "ResultArgsRequestCode";
    
        private static final String BUNDLE = "ResultArgsBundle";
    
    
        private final Map<String, Object> mArgsMap = new HashMap<>();
    
        public ResultArgs(@IdRes int recipientId, int requestCode) {
            mArgsMap.put(RECIPIENT_ID, recipientId);
            mArgsMap.put(REQUEST_CODE, requestCode);
        }
    
        public ResultArgs(Bundle bundle) {
            if (null == bundle) {
                return;
            }
            setBusinessArgs(bundle);
            mArgsMap.put(RECIPIENT_ID, bundle.getInt(RECIPIENT_ID));
            mArgsMap.put(REQUEST_CODE, bundle.getInt(REQUEST_CODE));
        }
    
        public Bundle toBundle() {
            Bundle temp = new Bundle();
            if (null != getBusinessArgs()) {
                temp.putAll(getBusinessArgs());
            }
            temp.putInt(RECIPIENT_ID, getRecipientId());
            temp.putInt(REQUEST_CODE, getRequestCode());
            return temp;
        }
    
        public @IdRes
        int getRecipientId() {
            return (int) mArgsMap.get(RECIPIENT_ID);
        }
    
        public int getRequestCode() {
            return (int) mArgsMap.get(REQUEST_CODE);
        }
    
        public ResultArgs setBusinessArgs(Bundle businessArgs) {
            if (null == businessArgs) {
                return this;
            }
            mArgsMap.put(BUNDLE, businessArgs);
            return this;
        }
    
        public Bundle getBusinessArgs() {
            return (Bundle) mArgsMap.get(BUNDLE);
        }
    
    }
    

    ResultArgs 类似于上文中提到的通过safeArgs生成的Bundle参数管理类

    使用方式

    public final class AFragment extends BaseFragment {
     private final Observer mViaPoiResultObserver = new Observer<Pair<Integer, Object>>() {
            @Override
            public void onChanged(Pair<Integer, Object> integerObjectPair) {
                Log.i(AFragment.class.getSimpleName(), "RequestCode: [ " + integerObjectPair.first + " ] " + " ResultData: [ " + integerObjectPair.second + " ] ");
            }
        };
        private void goBFragment() {
            startFragmentForResult(R.id.action_AFragment_to_BFragment,2)
            .observe(this, mViaPoiResultObserver);
        }
    }
    
    public final class BFragment extends BaseFragment {
      @Override
        protected void onBindListener() {
            mBackBtn.setOnClickListener(view -> {
                setResult("我是返回数据");
                back();
            });
        }
    }
    

    假设有业务需求为 A-B-C, C关闭时要返回到A并将数据传递到A:

    public final class AFragment extends BaseFragment {
     private final Observer mViaPoiResultObserver = new Observer<Pair<Integer, Object>>() {
            @Override
            public void onChanged(Pair<Integer, Object> integerObjectPair) {
                Log.i(AFragment.class.getSimpleName(), "RequestCode: [ " + integerObjectPair.first + " ] " + " ResultData: [ " + integerObjectPair.second + " ] ");
            }
        };
        private void goBFragment() {
            startFragmentForResult(R.id.action_AFragment_to_BFragment,2).observe(this, mViaPoiResultObserver);
        }
    }
    
    public final class BFragment extends BaseFragment {
     private void goCFragment(){
            go(R.id.action_BFragment_to_CFragment,mArgs.toBundle());
        }
    }
    
    public final class CFragment extends BaseFragment  {
    
        @Override
        protected void onBindListener() {
            mCloseBtn.setOnClickListener(view -> {
                setResult("我是返回数据");
                popTo(R.id.BFragment);
            });
        }
    }
    

    使用起来也是非常简单的!

    展开全文
  • ListView +ViewPage+Fragmen+TabHost滑动效果,外加上拉刷新,下拉加载更多
  • 在Activity中,我们经常使用动态加载的形式来创建一个或者多个Fragment,所以导致不同位置甚至是不同时间,都会有不同的Fragment,存在。 如果要管理Activity和Frament的关系,那么Activity和Fragment之间的数据传输...

    系列文章:安卓开发之Activity间传输数据(多场景分析)

    在Activity中,我们经常使用动态加载的形式来创建一个或者多个Fragment,所以导致不同位置甚至是不同时间,都会有不同的Fragment,存在。
    如果要管理Activity和Frament的关系,那么Activity和Fragment之间的数据传输就十分重要。

    需要的文件:一个附带layout的Fragment以及MainActivity
    一、Activity---->Fragment
    第一步:
    在Fragment中编写静态方法

    public static FragmentTest newInstance(String title){
    		FragmentTest  fragmentTest=new FragmentTest();
    		Bundle bundle=new Bundle();
    		bundle.putString("bundle_title",title);//这里的参数一最好常量化
    		FragmentTest.setArguments(bundle);
    		return fragmentTest;
    }
    
    

    这个方法是用来在Activity中动态加载Fragment时的初始化Fragment方法,可以在初始化的时候传输数据

    第二步:
    在Fragment的onCreate方法

            super.onCreate(savedInstanceState);
            if (getArguments()!=null)
            {
                mtitle=getArguments().getString("bundle_tilte");
            }
    

    这里可以接受到动态加载Fragment时Activity传输的数据,然后可以把接收到的数据全局化,即可在onCreateView中使用传输来的数据。

    第三步:动态加载Fragment
    在Activity中:
    第一种写法

                    FragmentTest fragmentTest=FragmentTest.newInstance("ggzx");
                    getSupportFragmentManager()
                            .beginTransaction()
                            .add(R.id.linearLayoutContainer, fragmentTest)
                            .commit();
    

    第二种

                    getSupportFragmentManager()
                            .beginTransaction()
                            .add(R.id.linearLayoutContainer, FragmentTest.newInstance("ggzx"))
                            .commit();
    

    以上就是简要的传输普通的String字符

    传一个String怎么够呢!!!!!!!!!!!!!

    我们来传bundle吧
    第一步:

        public static FragmentTest newInstance(Bundle bundle){
            FragmentTest fragmentTest=new FragmentTest();
            fragmentTest.setArguments(bundle);
            return fragmentTest;
        }
    

    这里其实比刚才传输String更简洁了,因为setArguments只能传入bundle类型参数,在使用String类型时,需要新建bundle,然后将String转入新建bundle,再将bundle给setArugments。
    因为我们直接传输bundle了,这里其实就更简洁了,直接把bundel放进去即可

    第二步

            if (getArguments()!=null)
            {
                mnum=getArguments().getInt("G_num",0);
            }
    

    第三步:

                    //创建bundle
                    Bundle bundle=new Bundle();
                    bundle.putInt("G_num",100);
                    FragmentTest fragmentTest=FragmentTest.newInstance(bundle);
                    getSupportFragmentManager()
                            .beginTransaction()
                            .add(R.id.linearLayoutContainer, fragmentTest)
                            .commit();
    

    这样就可以使用了,大家可以在这个简单的案例上面进行扩充。

    上面是理论基础,下面加上代码吧。

    Activity:

    public class MainActivity extends AppCompatActivity {
        Button button;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    //        FragmentTest fragmentTest=FragmentTest.newInstance("bundle_title");
    //        getSupportFragmentManager()
    //                .beginTransaction()
    //                .add(R.id.linearLayoutContainer, FragmentTest.newInstance("ggzx"))
    //                .commit();
            button=findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //创建bundle
                    Bundle bundle=new Bundle();
                    bundle.putInt("G_num",100);
                    FragmentTest fragmentTest=FragmentTest.newInstance(bundle);
                    getSupportFragmentManager()
                            .beginTransaction()
                            .add(R.id.linearLayoutContainer, fragmentTest)
                            .commit();
                }
            });
    
        }
    }
    

    Fragment:

    public class FragmentTest extends Fragment {
    
        int mnum;
        public static FragmentTest newInstance(Bundle bundle){
            FragmentTest fragmentTest=new FragmentTest();
            fragmentTest.setArguments(bundle);
            return fragmentTest;
        }
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view=inflater.inflate(R.layout.fragment_blank,container,false);
            Button button=view.findViewById(R.id.button3);
            button.setText(mnum+"");
            return view;
    
        }
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (getArguments()!=null)
            {
                mnum=getArguments().getInt("G_num",0);
            }
        }
    }
    
    展开全文
  • 我只是从HoneyComb的片段设计开始。 我创建了两个片段。 当我单击左侧片段中的按钮时,将在右侧创建一个新片段。 同时,当我单击右侧片段中的按钮时(即,下面代码中的DetialsFragment应该替换为另一个片段。...

    我只是从HoneyComb的片段设计开始。 我创建了两个片段。 当我单击左侧片段中的按钮时,将在右侧创建一个新片段。 同时,当我单击右侧片段中的按钮时(即,下面代码中的DetialsFragment应该替换为另一个片段。main.xml

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="horizontal" >

    android:id="@+id/titles" android:layout_weight="1"

    android:layout_width="0px"

    android:layout_height="match_parent" />

    android:layout_width="0px"

    android:layout_height="match_parent" />

    FragmentExample.java

    public class FragmentExample extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    }

    }

    Titles.java

    public class Titles extends Fragment {

    public FragmentTransaction ft;

    @Override

    public View onCreateView(LayoutInflater inflater,

    ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.main1, null);

    Button button1 = (Button)v.findViewById(R.id.button1);

    button1.setText("santhosh");

    button1.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View arg0) {

    // TODO Auto-generated method stub

    DetailsFragment details = (DetailsFragment)

    getFragmentManager().findFragmentById(R.id.details);

    if (details == null || details.getShownIndex() != 1) {

    // Make new fragment to show this selection.

    details = DetailsFragment.newInstance(1);

    // Execute a transaction, replacing any existing

    // fragment with this one inside the frame.

    ft

    = getFragmentManager().beginTransaction();

    ft.add(R.id.details, details, "detail");

    ft.setTransition(

    FragmentTransaction.TRANSIT_FRAGMENT_FADE);

    ft.commit();

    }

    }

    });

    return v;

    }

    }

    DetailsFragment.java

    public class DetailsFragment extends Fragment {

    /**

    * Create a new instance of DetailsFragment, initialized to

    * show the text at 'index'.

    */

    Titles title = new Titles();

    String[] titles = {"Title1", "Title2", "Title3", "Title4"};

    public static DetailsFragment newInstance(int index) {

    DetailsFragment f = new DetailsFragment();

    // Supply index input as an argument.

    Bundle args = new Bundle();

    args.putInt("index", index);

    f.setArguments(args);

    return f;

    }

    public int getShownIndex() {

    return getArguments().getInt("index", 0);

    }

    @Override

    public View onCreateView(LayoutInflater inflater,

    ViewGroup container, Bundle savedInstanceState) {

    if (container == null) {

    // Currently in a layout without a container, so no

    // reason to create our view.

    return null;

    }

    Button button = new Button(getActivity());

    button.setText("Next");

    button.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

    // TODO Auto-generated method stub

    }

    });

    return button;

    }

    }

    展开全文
  • SindingMenu+fragmen+viewpager实现左边侧滑栏效果。很简单的代码,无需害怕!如果对fragmen+viewpager不甚了解请看博客:http://blog.csdn.net/bobo8945510/article/details/52821741
  • Fragmen高手进阶

    2018-09-05 14:29:26
    基础知识,如何拿到java的修饰符: https://blog.csdn.net/xiao__gui/article/details/8141216 解决重叠的第四种方法: ... 1. 我们判断一下 ...override fun onCreate(savedInstanceState: Bundle?... ...
  • fragmen的基本使用

    2020-02-29 12:45:58
    public class TabFragment extends Fragment { private static final String BUNDLE_KEY = "BUNDLE_KEY"; private TextView tv; private String mTitle; public static TabFragment newInstance(...
  • 我正在做我的第一个Android应用程序,并且想直接进入ICS API。 到目前为止,我已经使用ActionBar创建了一个应用程序,并使用Viewpager和Fragments创建了可滑动选项卡。但是,我确实遇到了一些错误,但我仍会继续提及...
  • 一、问题描述: 二、解决: .eslintrc.js配置 "extends": ["vue", "standard", "plugin:vue/recommended"], 三、重启项目后问题消失。 四、欢迎交流指正。 ...
  • 第一种:Fragment对Activity传递数据 首先上张Gif图,看起来直观一点,直入主题。自己手机录屏然后转的Gif图。 可以看出,通过点击InfoFragment界面的按钮来实现activity底部导航栏(这里我用的...
  • 这次来个稍微难一点的,用fragmen套住ViewPager,ViewPager里面套fragment 听着很绕,但是我们需要把ViewPager看作是一个UI,就是一个工具而已,而fragment看作一个工具箱 这样的话就是把工具放进工具箱,然后打开...
  • 在开发中,actiity使用替换的方式切换fragmen,其中两个fragment使用了同一布局,使用include导入eg: &lt;include layout="@layout/layout_tab_with_viewpage"/&gt; 在运行后发现,只能支持一...
  • Fragment向Fragmen跳转

    2018-09-14 16:30:37
    一、简介 最近做项目涉及到了很多关于Fragment跳转的问题,虽然跳转的方式不多,但还是搞的我的晕头转向,所以写了一篇文章主要介绍有关Fragment的四种跳转方式: 1、从同一个Activiy的一个Fragment跳转到另外...
  • android fragmen1跳转到下一个fragmen2再返回,,怎么样让fragment1在跳转之前的显示状态不变 ?fragment1中有一个viewPager(包含两个view)
  • 很好用的框架,我已经搭建好,当下,美丽说就用到了这样的界面开发,美观而且实现多页面切换。
  • android fragmen 仿IOS微信底部布局
  • 这里可以看提示 出现cardview 和 support-fragmen27.0.2 fragment和上面被注释掉的design有关系,那我们把design版本改一下 又出现这个 下方的依赖大多数都是要依赖support-fragement的 所以我们吧下方的依赖...
  • 在我们开发的过程中可能会遇到类似需求,我们需要做一个左右滑动的tab导航,这个时候有些朋友可能会想到viewpager和fragment的结合来实现这个功能; 当然实现的方法不单单着一种。我们这个随笔讨论的是这种方式实现...
  • 从Activity跳到fragment之后,按返回键,fragment没有回到Activity界面,直接被销毁了
  • 转载请注明:http://blog.csdn.net/feather_wch/article/details/79391699 1、Fragment中的回退 通过所属的Activity的回退实现该Fragment的退出 getActivity().onBackPressed(); ...该方法中的onBackPr...
  • Fragmen详解

    千次阅读 2014-01-13 17:39:49
    Fragment是Android自从3.0之后新加入的一个组件,我相信很多人都已经听说过这个组件了,但这个组件到底是个什么,如何去使用他呢,且听我讲来。 以下部分资料来自官网(官网才是王道,其他都是浮云) ...
  • 这次我主要遇到的问题是fragment的平滑切换,根据一大堆的用户体验什么的来说就是在左右滑动切换activit时,基本体验是没fragment好的,所以在用fragment做切换的时候我遇到的问题是,按返回键时,要确定是切换到了...
  • 1 布局文件 a 新建三个布局文件,分别放置一个TextView,用来模拟内容。 b 主布局,一个标题栏,一个线性布局承载Fragment内容,底部三个点击的Tab按钮,xml如下:(activity_main.xml)  android:layout_width...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,996
精华内容 798
关键字:

fragmen

友情链接: tmbenoise.rar