【问题标题】:Activity Can not close while call from Fragment从片段调用时活动无法关闭
【发布时间】:2021-08-04 02:52:16
【问题描述】:

我创建了一个销售订单菜单,该菜单使用 Activity 和 Fragment 文件, 问题是当我显示客户列表页面以查找将在 SalesOrder 页面上使用的客户数据时(创建数据选项卡(使用片段)) CustomerList 页面未关闭, 这是我的代码 首播节目

enter image description here

然后我像这样点击销售订单显示,它的文件 SalesOrderActivity.kt Page SalesOrder 使用 TabLayout 和 Fragment ,即(用于创建数据和片段列表数据的片段) enter image description here

File SalesOrderActivity.kt
    class SalesOrderActivity : AppCompatActivity() {
        lateinit var viewPager     : ViewPager
        lateinit var tabs          : TabLayout
        private var appContext: Context? = null

        override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_sales_order)

          CommonCtx.setViewXml2(contentView)
          setSupportActionBar(findViewById(R.id.my_toolbar))
          supportActionBar!!.title = "Sales Order"
          supportActionBar!!.setDisplayHomeAsUpEnabled(true)

          viewPager    = findViewById(R.id.viewPager)
          tabs         = findViewById(R.id.tabs)
          tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
              override fun onTabSelected(tab: TabLayout.Tab?) {
                  val position = tab?.position
                  if (position == 1) {
                     println("get selected")
                  }
          }

          override fun onTabUnselected(tab: TabLayout.Tab?) {
          }

           override fun onTabReselected(tab: TabLayout.Tab?) {
           }
        })

        appContext = this
        CommonCtx.setActivity(this)
        setUpTabs()
    }


    //SHOW FRAGMENT CREATE DATA AND LIST DATA
    private fun setUpTabs(){
        val adapter = com.myapp.sfa.adapter.ViewPagerAdapter(supportFragmentManager)
        adapter.addFragment(SalesOrderCreateDataFragment(), "Create Data")
        adapter.addFragment(CustomerListDataFragment(),     "List Data")

        viewPager.adapter = adapter
        tabs.setupWithViewPager(viewPager)
        setupTabIcons()
    }

    private fun setupTabIcons() {
        tabs.getTabAt(0)!!.setIcon(tabIcons.get(0))
        tabs.getTabAt(1)!!.setIcon(tabIcons.get(1))
    }

    private val tabIcons = intArrayOf(
        R.drawable.add_sign,
        R.drawable.list_48
    )
    override fun onSupportNavigateUp(): Boolean {
        finish()
        return true
    }

}

在页面销售订单中,我使用片段显示选项卡创建数据和列出数据 这 文件 SalesOderCreateDataFragment.kt

    class SalesOrderCreateDataFragment : Fragment() {

        private var appContext: Context? = null
        private lateinit var txtvCustId  : TextView
        public lateinit var edtCustCode : EditText
        private lateinit var btnCustomer : Button
        lateinit var DBHelper : DBHelper
      
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            appContext = this.getActivity()
            DBHelper = DBHelper(appContext!!))
        }
   
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, 
                              savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_sales_order_create_data,container,false)
        
        txtvCustId  = view.findViewById<TextView>(R.id.txtvCustId)
        edtCustCode = view.findViewById<EditText>(R.id.edtCustCode)
        btnCustomer = view.findViewById(R.id.btnCustomer)
        
             btnCustomer.setOnClickListener {
                 showCustomer()
             }
       
        appContext = this.getActivity()
        return view
    }


    //SHOW LIST CUSTOMER event clik Cust. Code
    fun showCustomer() {
         val intent = Intent(this.getActivity(), CustomerListActivity::class.java)
         //intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP)
         intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
         CommonCtx.getContext().startActivity(intent)
         CustomerListActivity().finish()
    }

    fun getCustomer(idCustomer: String){
         var customerPojo = CustomerPojo()
         customerPojo= SQLCustomer().getCustomerById(idCustomer)
    }
}

当我点击按钮 Cust Code enter image description here

会显示页面CustomerListActivity,像这张图 客户代码事件中的代码

enter image description here

File CustomerListActivity.kt
class CustomerListActivity : AppCompatActivity() {
    private lateinit var recyclerView   : RecyclerView
    lateinit var DBHelper : DBHelper

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_customer_list)
        setSupportActionBar(findViewById(R.id.my_toolbar))
        supportActionBar!!.title = "Customer List"
        supportActionBar!!.setDisplayHomeAsUpEnabled(true)

        recyclerView =findViewById(R.id.recyclerView)
        DBHelper = DBHelper(applicationContext)//this)

        //get data customer in database local
        var listCustomerPojo : MutableList<CustomerPojo> = ArrayList()
        listCustomerPojo = SQLCustomer().getCustomerList()

        //show data customer in Recycle Card View
        showListDataToRecycleCardView(listCustomerPojo);
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
         menuInflater.inflate(R.menu.main, menu)
         val searchItem = menu.findItem(R.id.menu_search)
         if(searchItem != null){
              val searchView = searchItem.actionView as SearchView
              val editext = searchView.findViewById<EditText> 
                           (androidx.appcompat.R.id.search_src_text)
              editext.hint = "Search here..."

              searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
                  override fun onQueryTextSubmit(query: String?): Boolean {
                      return true
                  }

              override fun onQueryTextChange(newText: String?): Boolean {
                  var listCustomerPojo: ArrayList<CustomerPojo> = ArrayList()
                  if (newText!!.isNotEmpty()) {
                      val search = newText.toLowerCase()
                      listCustomerPojo = SQLCustomer().getCustomerByName(newText)
                   }
                   showListDataToRecycleCardView(listCustomerPojo);
                   return true
               }
          })
       }
      return super.onCreateOptionsMenu(menu)
   }

   fun showListDataToRecycleCardView(listCustomerPojo: MutableList<CustomerPojo>){
         var customerListDC = arrayListOf<CustomerDataModel>()
         for (i in 0 until listCustomerPojo.size) {
              var custPojo: CustomerPojo = listCustomerPojo[i]
              val  cdm = CustomerDataModel(R.drawable.shop_on_ballon_36,
                                           custPojo.custId.toString(),
                                           custPojo.custCode.toString(),
                                           custPojo.custName.toString(),
                                           custPojo.address.toString())
             customerListDC.add(cdm)
          }

          val recyclerAdapter = CustomerListRecyclerAdapter(customerListDC)
          recyclerView.apply {
                              adapter = recyclerAdapter
                              addItemDecoration(DividerItemDecoration(CommonCtx.getContext(), 
                                                DividerItemDecoration.VERTICAL))
                              setHasFixedSize(true)
           }
     }

     override fun onSupportNavigateUp(): Boolean {
        finish()
        return true
     }

}

文件 CustomerListRecyclerAdapter.kt

class CustomerListRecyclerAdapter(private var customerListData: ArrayList<CustomerDataModel>) 
                            : RecyclerView.Adapter<CustomerListRecyclerAdapter.ViewHolder>(){

      var appContext: Context? = null
      
      override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
           val layoutInflater = LayoutInflater.from(parent.context)
           val view = layoutInflater.inflate(R.layout.recycler_customer_list, parent, false)
           appContext = parent.context
           return ViewHolder(view)
       }

       override fun getItemCount(): Int = customerListData.size

       override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            val movie = customerListData[position]
             holder.bind(movie)
       }

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
         val intent: Intent? = null
         init {
                itemView.setOnClickListener {
                      var textvCustId   = itemView.findViewById<TextView>(R.id.textvCustId)
                      var textvCustName = itemView.findViewById<TextView>(R.id.textvCustName)
                }

         } 
    
      fun bind(model: CustomerDataModel) {
          var imgViewIcon   = itemView.findViewById<ImageView>(R.id.imgViewIcon)
          var textvCustId   = itemView.findViewById<TextView>(R.id.textvCustId)
          var textvCustCode = itemView.findViewById<TextView>(R.id.textvCustCode)
          var textvCustName = itemView.findViewById<TextView>(R.id.textvCustName)
          var textvAddress  = itemView.findViewById<TextView>(R.id.textvAddress)
          var btnCreateSO   = itemView.findViewById<Button>(R.id.btnCreateSO)
          var btnCreateSR   = itemView.findViewById<Button>(R.id.btnCreateSR)

          imgViewIcon.setImageResource(model.iconPict)
          textvCustId.text   = model.custId
          textvCustCode.text = model.custCode
          textvCustName.text = model.custName
          textvAddress.text  = model.address

          textvCustId.setVisibility(View.INVISIBLE)
          btnCreateSO.setOnClickListener {
                SalesOrderCreateDataFragment().getCustomer(textvCustId.text.toString())
          }
      }
   }//end class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}

文件 CommonCtx.kt

   @SuppressLint("StaticFieldLeak")
   abstract class CommonCtx {
        companion object {
        @Volatile
        private lateinit var appContext   : Context
        private lateinit var mainActivity : Activity
        private lateinit var myActivity   : Activity
        private lateinit var myView       : View
        private lateinit var myView2      : View
        private lateinit var myView3      : View
        private lateinit var myContainer: ViewGroup

        fun setContext(context: Context) {
            appContext = context
        }

        fun getFilesDir():String {
           return appContext.filesDir.absolutePath
        }

        fun getOpenFileInput(fileName : String): FileInputStream {
           return appContext.openFileInput(fileName)
        }

        fun getOpenFileOutput(fileName : String): FileOutputStream {
           return appContext.openFileOutput(fileName, MODE_PRIVATE)
        }

        fun getContext():Context{
           return appContext
        }

        fun getContext2():Context{
           return appContext.applicationContext
        }

        fun setMainActivity(activity: Activity) {
           mainActivity = activity
        }
        fun getMainActivity():Activity{
           return mainActivity
        }

        fun setActivity(activity: Activity) {
           myActivity = activity
        }
        fun getActivity():Activity{
           return myActivity
        }

        fun setViewXml(view : View) {
            myView = view
        }
        fun getViewXml():View{
           return myView
        }

        fun setViewXml2(view: View?) {
            if (view != null) {
               myView2 = view
            }
        }
        fun getViewXml2():View{
            return myView2
        }

        fun setViewXml3(view: View?) {
           if (view != null) {
               myView3 = view
           }
        }
        fun getViewXml3():View{
            return myView3
        }

        fun setContainer(container : ViewGroup) {
             myContainer = container
        }
        fun getContainer():ViewGroup{
             return myContainer
        }
    }
  }

文件 AndroidManifest.xml

     <?xml version="1.0" encoding="utf-8"?>
         <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="com.myapp.sfa">
         <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
         <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
         <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
         <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" /> 
         <uses-permission android:name="android.permission.INTERNET" />
         <application
             android:allowBackup="true"
             android:icon="@mipmap/ic_launcher"
             android:label="@string/app_name"
             android:networkSecurityConfig="@xml/network_security_config"
             android:roundIcon="@mipmap/ic_launcher_round"
             android:supportsRtl="true"
             android:theme="@style/Theme.MyAppSFA">

             <activity android:name=".view.MainActivity">
                 <intent-filter>
                     <action android:name="android.intent.action.MAIN" />
                     <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
             </activity>
             <activity android:name=".ui.view.NetworkSettingActivity"              
                       android:screenOrientation="portrait" />
             <activity android:name=".ui.view.salesman.SalesmanProfileActivity" 
                       android:screenOrientation="portrait" />
             <activity android:name=".ui.view.sales.SalesOrderActivity" 
                       android:launchMode="singleTop"/>
             <activity android:name=".ui.view.sales.SalesReturnActivity"/>
             <activity android:name=".view.ui.customer.CustomerActivity"  />
             <activity android:name=".view.ui.list.CustomerListActivity"  
                       android:noHistory="true"/>
             <activity android:name=".view.ui.list.ProductItemListActivity" />
         </application>
   </manifest>

问题,当我在 CustomerListActivity 页面中单击按钮 Create SO 页面 CustomerListActivity 未关闭并返回页面 SalesOrderActivity

谢谢

enter image description here

【问题讨论】:

    标签: android kotlin android-fragments


    【解决方案1】:

    在此代码中,文件 CustomerListRecyclerAdapter.kt 不工作,CustomerListActivity.kt 没有关闭

    btnCreateSO.setOnClickListener {
       SalesOrderCreateDataFragment().getCustomer(textvCustId.text.toString())
    }
    

    【讨论】:

    • 请停止添加答案,就像您正在编辑问题一样。通过澄清信息来编辑原始问题是这里的方法。
    【解决方案2】:

    这是我的文件 build.gradle(:app)

    plugins {
        id 'com.android.application'
        id 'kotlin-android'
        id 'kotlin-kapt'
    }
    android {
        compileSdkVersion 30
        buildToolsVersion "30.0.3"
    defaultConfig {
        applicationId "com.myapp.sfa"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    
    buildFeatures {
        viewBinding true
    }
    dataBinding {
        enabled = true
    }
    
    
    sourceSets {
        main {
            res.srcDirs = [
                    'src/main/res',
                    'src/main/res/layout',
                    'src/main/res/layout/fragments',
                    'src/main/res/layout/salesaction',
                    'src/main/res/layout/salesman',
                    'src/main/res/layout/setting',
                    'src\\main\\res', 'src\\main\\res\\layout\\itemrecycler', 'src\\main\\res\\layout\\product', 'src\\main\\res\\layout\\customer'
                          ]
        }
        //debug {
        //    res.srcDirs = ['resources/debug']
        //}
    }
    }
    
    dependencies {
        implementation fileTree(dir: "libs", include: ["*.jar"])
        implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        implementation "org.jetbrains.anko:anko:0.10.8"
        implementation 'androidx.core:core-ktx:1.3.2'
        implementation 'androidx.appcompat:appcompat:1.2.0'
        implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    
        implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
        implementation 'com.squareup.retrofit2:retrofit:2.9.0'
        implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
        implementation "com.squareup.retrofit2:converter-moshi:2.4.0"
        implementation 'com.squareup.okhttp3:logging-interceptor:4.4.0'
        implementation 'com.squareup.okhttp3:okhttp:4.9.0'
        implementation 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0'
    
        implementation 'com.google.code.gson:gson:2.8.6'
        implementation 'androidx.lifecycle:lifecycle-common:2.2.0'
        implementation 'androidx.lifecycle:lifecycle-runtime:2.2.0'
        implementation 'android.arch.lifecycle:extensions:2.2.0'
        implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
        implementation "androidx.viewpager:viewpager:1.0.0"
        implementation 'com.google.android.material:material:1.3.0'
        implementation 'androidx.appcompat:appcompat:1.3.0-rc01'
        implementation 'androidx.legacy:legacy-support-v4:1.0.0'
        implementation 'androidx.cardview:cardview:1.0.0'
        implementation "androidx.recyclerview:recyclerview:1.1.0"
        implementation 'com.github.bumptech.glide:glide:4.9.0'
        implementation 'androidx.multidex:multidex:2.0.1'
        implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'androidx.test.ext:junit:1.1.2'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
        androidTestImplementation "org.jetbrains.kotlin:kotlin-test- 
        junit:$kotlin_version"
    }
    

    任何其他想法,我应该更改显示客户列表的方式吗?

    谢谢

    【讨论】:

      【解决方案3】:

      我在 CustomerListRecycleAdapter.kt 中添加了代码 (itemView.context as Activity).finish()

      btnCreateSO.setOnClickListener {
            SalesOrderActivity().selectedTabForUpdate(textvCustId.text.toString())
            (itemView.context as Activity).finish()
      }
      

      这项工作,客户列表关闭 谢谢大家

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        • 2017-08-09
        相关资源
        最近更新 更多